java - 删除主键最接近X的行

标签 java sql jdbc sqlite

我正在尝试删除一行,其主键(列名=版本)例如为 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.0024002 除以 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/

相关文章:

java - 为什么我在 TimeUnit 上得到一个编译器错误(不能从 long 转换为 Long)到一个日期,而如果我更改 java 编译器我就不再得到它

java - 对字符串数组中的 2 个字符串进行排序 (Java)

java - 在 spring-jdbc 中使用 "where in"

sql - SQL选择项跨越整个属性范围

java - 每个不同的 SQL 查询是否需要不同的 PreparedStatement 对象?

JavaFx 透明窗口 - 是的,请。鼠标透明 - 不,谢谢

Java 为什么需要实现接口(interface)?

mysql - SQLYog 为 MySQL 设置变量返回 null

java - Play Framework JPA : how to implement one-to-many relationship?

sql - Java DB/Derby-表名中的空白-如何转义?