如何解决Android SQLite舍入错误

如何解决Android SQLite舍入错误,android,sqlite,rounding,rounding-error,Android,Sqlite,Rounding,Rounding Error,我们的Android应用程序在舍入数字方面存在问题。在用Java进行的计算中,我们使用了BigDecimal,这很有帮助,但对于例如SQLite,我们有问题 SELECT ROUND(150.075 * 100) / 100 (= 150.07, not 150.08!) 这是因为由于浮点不准确,150.075*100与15007.5不同。双精度浮点中150.075的十进制表示形式为150.074999999999722444243843711 要获得所需的行为,请使用双参数版本的ROUND(

我们的Android应用程序在舍入数字方面存在问题。在用Java进行的计算中,我们使用了BigDecimal,这很有帮助,但对于例如SQLite,我们有问题

SELECT ROUND(150.075 * 100) / 100 (= 150.07, not 150.08!)

这是因为由于浮点不准确,
150.075*100
15007.5
不同。双精度浮点中
150.075
的十进制表示形式为
150.074999999999722444243843711

要获得所需的行为,请使用双参数版本的
ROUND()
,它允许您指定小数位数:

sqlite> SELECT ROUND(150.075, 2);
150.08
您对这个(不优雅的)解决方案的看法:

SELECT ROUND(150.075 + 0.00000000000009, 2) (= 150.08)

我们检查了5000多个不正确的值,结果很好。

@Selvin是的,我知道-但如果可能,搜索解决方案。将数据存储为int。。。像150075。。。然后在java代码中使用BigDecimal(150075,3),不幸的是,这不是一个好的解决方案。在Android SQLite中(但在Google Chrome中也是如此)选择ROUND(150.075,2)返回150.07。我们注意到有时OSX上有一个数字是对的,Windows上有一个数字是错的。。。反之亦然。@ekstro在内部,sqlite使用自己的
printf()
进行舍入,它的某些版本具有类似的浮点精度。