我正在尝试删除一行,其主键(列名=版本)例如为 4.002000000000001。所以我给出这样的说法:
DELETE FROM tbl WHERE version=4.002;
现在这不起作用,因为没有行的版本等于 4.002,只有一行的版本等于 4.002000000000001。 请不要问我为什么不存储版本在数据库中为 4.002,因为我试图通过将列类型设置为 DECIMAL(5,3) 来实现此目的,但它仍然将 Java 中的 double 值存储为 4.002000000000001。请不要问我为什么不说“...WHERE version=4.002000000000001;”因为现在我无法控制当我使用 JDBC 创建语句时 java 如何格式化它(即使使用 DecimalFormat 类)。
那么SQLite3中有没有一种方法可以向下取整(下取整函数)?那么我可以说“删除 FLOOR(version) 等于 4.002 的行?
我是一名 C++ 程序员(使用 Java 查询 SQL 数据库,请不要问为什么:P),不熟悉复杂的 SQL 查询,所以这对于我想做的事情是否正确:
DELETE FROM tbl WHERE ROUND(version, 0.5)=4.002;
最佳答案
And please dont ask why I dont say "...WHERE version=4.002000000000001;" because right now I have no control over how java formats it doubles(even using DecimalFormat class)
我不会。
但是我会问你为什么使用double
来存储版本号。
机器浮点类型(基数为 2)不保存精确的十进制数。但版本号字符串是准确的。您最好将版本“编号”视为以下之一,具体取决于您的版本编号方案:
- 按比例缩放的整数;例如
4.002
是4002
除以1000
。您可能不需要显式存储缩放因子。 - 整数元组或数组;例如
4.002
是{4,2}
。这允许像4.003.005
这样的版本号表示为{4,3,5}
等。 - 受模式约束的字符串;例如
4.002
是与正则表达式"\d+\.\d\d\d"
匹配的字符串。这允许版本字符串包含非数字部分。
选择其中之一,您就不必担心内存或数据库中浮点类型的基本不精确性质。
<小时/>哦,顺便说一句 DecimalFormat
类确实让您在格式化数字时控制小数点后的位数。您可以使用模式或通过调用 setMaximumFractionDigits
来指定它
关于java - 删除主键最接近X的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5123676/