删除其主键最接近X的行

use*_*747 0 java sql sqlite jdbc

我试图删除一行,其主键(列名=版本)例如是4.002000000000001.所以我说声明:

DELETE FROM tbl WHERE version=4.002;
Run Code Online (Sandbox Code Playgroud)

现在,这不会工作,因为没有版本等于4.002的行,只有版本等于4.002000000000001的行. 请不要问为什么我不将版本存储为DB中的4.002,因为我试图通过使列类型为DECIMAL(5,3)来实现,但它仍然存储来自Java的双精度为4.002000000000001.请不要问为什么我不说"...... WHERE version = 4.002000000000001;" 因为当我使用JDBC创建语句时,我无法控制java格式如何加倍(甚至使用DecimalFormat类).

那么有没有办法在SQLite3中向下舍入(floor函数)?那么我可以说"删除其FLOOR(版本)等于4.002的行?

我是一名C++程序员(使用Java查询SQL数据库,请不要问为什么:P)谁不熟悉复杂的SQL查询,所以这对我想做的事情是正确的:

DELETE FROM tbl WHERE ROUND(version, 0.5)=4.002;
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 5

请不要问为什么我不说"...... WHERE version = 4.002000000000001;" 因为现在我无法控制java格式如何加倍(即使使用DecimalFormat类)

我不会.

但我会问你为什么double用来存储版本号.

机器浮点类型(基数2)不包含精确的十进制数.但版本号字符串是准确的.根据您的版本编号方案,您最好将版本"数字"视为以下之一:

  • 缩放整数; 例如4.0024002除以1000.您可能不需要显式存储缩放因子.
  • 元组或整数数组; 例如4.002{4,2}.这允许版本号4.003.005表示为{4,3,5}等等.
  • 受图案约束的字符串; 例如,4.002是一个匹配正则表达式的字符串"\d+\.\d\d\d".这允许版本字符串具有非数字部分.

选择其中之一,您不必担心浮点类型在内存或数据库中的基本不精确性.


哦,顺便DecimalFormat可以让你控制的位数的小数点后当你格式的数字.您可以使用模式或通过调用来指定它setMaximumFractionDigits