2013-03-07 51 views
2

我們在Android應用程序中使用舍入數字時遇到問題。在Java中進行計算時,我們使用BigDecimal,這有所幫助,但我們遇到了SQLite問題,例如。Android sqllite舍入錯誤

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

任何消化?

+2

http://www.sqlite.org/faq.html#q16 – Selvin 2013-03-07 12:27:24

+0

@Selvin是的,我知道它 - 但如果可能的話尋找解決方案。 – ekstro 2013-03-07 12:32:46

+0

將數據存儲爲int ...像150075 ...然後在java代碼中使用BigDecimal(150075,3) – Selvin 2013-03-07 12:35:06

回答

0

這是因爲由於浮點不準確,150.075 * 10015007.5不一樣。雙精度浮點型150.075的十進制表示形式爲150.07499999999999999722444243843711

爲了得到你想要的行爲,使用的ROUND()兩個參數版本,它可以讓你指定的小數位數:

sqlite> SELECT ROUND(150.075, 2); 
150.08 
+0

不幸的是,這不是一個好的解決方案。在Android SQLite中(但也在Google Chrome中)SELECT ROUND(150.075,2)返回150.07。我們注意到有時一個數字在OSX上是正確的,在Windows上是錯誤的,反之亦然。 – ekstro 2013-03-07 12:48:19

+1

@ekstro在內部,sqlite使用自己的'printf()'進行舍入,並且它的某些版本具有類似的浮點不準確性。 – laalto 2013-03-07 14:15:36

1

你覺得這個怎麼樣(不優雅)的解決方案:

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

我們檢查了超過5 000個不正確的值,它的效果很好。