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)
请不要问为什么我不说"...... WHERE version = 4.002000000000001;" 因为现在我无法控制java格式如何加倍(即使使用DecimalFormat类)
我不会.
但我会问你为什么double用来存储版本号.
机器浮点类型(基数2)不包含精确的十进制数.但版本号字符串是准确的.根据您的版本编号方案,您最好将版本"数字"视为以下之一:
4.002被4002除以1000.您可能不需要显式存储缩放因子.4.002是{4,2}.这允许版本号4.003.005表示为{4,3,5}等等.4.002是一个匹配正则表达式的字符串"\d+\.\d\d\d".这允许版本字符串具有非数字部分.选择其中之一,您不必担心浮点类型在内存或数据库中的基本不精确性.
哦,顺便DecimalFormat类也可以让你控制的位数的小数点后当你格式的数字.您可以使用模式或通过调用来指定它setMaximumFractionDigits
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |