【问题标题】:How to solve Android SQLite rounding error如何解决 Android SQLite 舍入错误
【发布时间】:2013-03-07 12:21:10
【问题描述】:

我们的 Android 应用程序存在四舍五入问题。在用 Java 进行计算时,我们使用 BigDecimal,这会有所帮助,但我们在使用 SQLite 时遇到了问题,例如。

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

【问题讨论】:

  • @Selvin 是的,我知道 - 但如果可能,请寻找解决方案。
  • 将数据存储为 int ... 比如 150075 ... 然后在 java 代码中使用 BigDecimal(150075 , 3)

标签: android sqlite rounding rounding-error


【解决方案1】:

你对这个(不优雅的)解决方案的看法:

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

我们检查了超过 5 000 个不正确的值,效果很好。

【讨论】:

    【解决方案2】:

    这是因为由于浮点数不准确,150.075 * 10015007.5 不同。双精度浮点中150.075 的十进制表示为150.07499999999999999722444243843711

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

    sqlite> SELECT ROUND(150.075, 2);
    150.08
    

    【讨论】:

    • 很遗憾,这不是一个好的解决方案。在 Android SQLite 中(但也在 Google Chrome 中)SELECT ROUND(150.075, 2) 返回 150.07。我们注意到有时一个数字在 OSX 上是正确的,而在 Windows 上是错误的……反之亦然。
    • @ekstro 在内部,sqlite 使用自己的 printf() 进行舍入,并且它的某些版本具有类似的浮点不准确性。
    猜你喜欢
    • 2013-03-21
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多