2017-07-27 31 views
0

在Android Studio中,由於java輪換方式,我在計算髮票總計時遇到了問題。我知道有很多解釋,但很多人推薦的方法不會返回可靠的結果。 例如:
1. Math.round((double)4.715 *(double)100)/(double)100 = 4.72(expected 4.72)
2. Math.round((double)4.725 *(double)100 )/(double)100 = 4.72(但預期爲4.73)Android Studio中的舍入觀察 - java。並預計一些實際解釋

您不能將此代碼放入計算髮票的客戶的應用程序中。因爲,在我的情況下,例如,在另一個系統中計算相同的發票,結果是不同的,分別意味着4.72 4.73
我知道一個double不能精確表示,小數點與我們所看到的不同。但是我們需要一種能夠按照我們的預期返回結果的方法

另一個例子是:
1. java.math.BigDecimal.valueOf(4.715).setScale(2,java.math.BigDecimal.ROUND_HALF_UP).doubleValue()= 4.72
2.新的java.math .BigDecimal(4.715).setScale(2,java.math.BigDecimal.ROUND_HALF_UP).doubleValue()= 4.71
3.新的java.math.BigDecimal(String.valueOf(4.715)).setScale(2,java.math我認爲所有這些方面都可以在Java文檔中得到很好的解釋,但是它們應該指出一種計算回合的方法,一種可靠的方法,它可以像我們預期的那樣返回結果。我只想繞到2次decimales。

總之,我希望能幫助一些初學者,我覺得下面的方法將返回穩定和良好的效果:
java.math.BigDecimal.valueOf(4.715).setScale(2的java.math或者,至少,這是我在3年以上的密集使用應用程序(每個工作日超過500個用戶)後的觀察結果。
上述所有的實際解釋都非常受歡迎,所以我們可以更好地瞭解如何避免意外的結果。

+0

您的第一個1和2是錯誤的。 – matt

+0

如果您使用BigDecimals,則使用字符串對它們進行初始化,而不是使用雙精度或浮點數。所以'x = new java.math.BigDecimal(「4.715」)。setScale(2,BigDecimal.ROUND_HALF_UP);'不要使用double,所以不要在BigDecimal上使用'.doubleValue()'。 –

+0

馬特,1和2可能是錯誤的,但它正是它們來自調試器的方式。這是我在現場遇到的問題。 我只是想爲初學者揭示這些方面,因爲文檔不適用於實際的例子,而只是從數學的角度來解釋。 – mihai71

回答

0

對於BigDecimal示例,javadoc解釋了區別。

BigDecimal(double value) ...是double的二進制浮點值的精確十進制表示形式。

我們可以通過打印該值來檢查。

System.out.println(new BigDecimal(4.715)); 
#4.714999999999999857891452847979962825775146484375 

這幾乎不到4.715,但足夠讓它向下舍入。

BigDecimal.valueOf(double value)使用來自Double.toString(double value)的具有相當多規則的double值的字符串表示形式。

System.out.println(Double.toString(4.715)); 
#4.715 

最安全的最好方法就是使用BigDecimal進行計算。