關於BigDecimal的比較
來源:http://www.javaworld.com.tw/jute/post/view?bid=5&id=265915
?
在需要做大量金融運算的系統中,我們常用 BigDecimal 來取來double ,因為若直接以double來加減乘除,
可能發生尾差或除不盡的問題,而BigDecimal則是提供了大量及豐富的 method,方便運算或四捨五入等等,
但是在二個BigDecimal數值的比較上,卻常有人寫錯(我自己是習慣使用 doubleValue 來比較,但真的是看過有人使用 == 或 equals)
像是 bigDecimalA == bigDecimalB 或是 bigDecimalA.equals(bigDecimalB ),都是不正確的寫法,
還有就是 BigDecimal建構方式的不同,也常會造成很大的差異,
正確的方式應該是使用 BigDecimal(String val) 或是 BigDecimal.valueOf(double val) 來建構,
若是整數那就還好,如果是浮點數,那就得小心一點了,
假 設建構一個數值為1.01234的BigDecimal物件(new BigDecimal(1.01234)),但是得到的並不是 1.01234 而是
1.0123400000000000176214598468504846096038818359375,真可怕。
所以 結論是,
1.統一建構方式就是使用 new BigDecimal(String val) 或是 BigDecimal.valueOf(double val)
2.使用compareTo來比較二個 BigDecimal 是否相同,因為 == 絕不可能一樣,而 equals 就得看運氣了(剛好是整數會一樣)。
最後,更詳細的解釋請看JAVA DOC它都有提到,或是打開java的src.zip來看看。
測試程式(片段)如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | public
void
testBigDecimal() { System.out.println("/n#測試數值0" ); System.out.println("------------------------------------------------------------" ); testBigDecimal(new BigDecimal[]{ BigDecimal.ZERO, new BigDecimal("0" ), new BigDecimal("0.0" ), new BigDecimal(0.0)} ); System.out.println("/n#測試數值1.01234" ); System.out.println("------------------------------------------------------------" ); testBigDecimal(new BigDecimal[]{ new BigDecimal("1.01234" ), new BigDecimal(1.01234)} ); } private void testBigDecimal(BigDecimal[] zeros) { try { for (int i = 0; i < zeros.length; i++) { System.out.println(i + " : "+ ToStringBuilder.reflectionToString(zeros[i])); } System.out.println("/n#Test1 [==]" ); for (int i = 0; i < zeros.length; i++) { for (int j = 0; j < zeros.length; j++) { if (i != j) { System.out.println(i + " == "+ j + " > "+ (zeros[i] == zeros[j])); } } } System.out.println("/n#Test2 [equals]" ); for (int i = 0; i < zeros.length; i++) { for (int j = 0; j < zeros.length; j++) { if (i != j) { System.out.println(i + " equals "+ j + " > "+ (zeros[i].equals(zeros[j]))); } } } System.out.println("/n#Test3 [compareTo]" ); for (int i = 0; i < zeros.length; i++) { for (int j = 0; j < zeros.length; j++) { if (i != j) { System.out.println(i + " compareTo "+ j + " > "+ (zeros[i].compareTo(zeros[j]) == 0)); } } } System.out.println("/n#Test4 [toString.equals]" ); for (int i = 0; i < zeros.length; i++) { for (int j = 0; j < zeros.length; j++) { if (i != j) { System.out.println(i + " toString "+ j + " > "+ (zeros[i].toString().equals(zeros[j].toString()))); } } } System.out.println("/n#Test5 [doubleValue]" ); for (int i = 0; i < zeros.length; i++) { for (int j = 0; j < zeros.length; j++) { if (i != j) { System.out.println(i + " doubleValue "+ j + " > "+ (zeros[i].doubleValue() == zeros[j].doubleValue())); } } } } catch (Exception e) { e.printStackTrace(); } } |
輸出結果如下:
#測試數值0
------------------------------------------------------------
0 : java.math.BigDecimal@141d683[intVal=0,scale=0]
1 : java.math.BigDecimal@5740bb[intVal=<null>,scale=0]
2 : java.math.BigDecimal@5ac072[intVal=<null>,scale=1]
3 : java.math.BigDecimal@109a4c[intVal=0,scale=0]
#Test1 [==]
0 == 1 > false
0 == 2 > false
0 == 3 > false
1 == 0 > false
1 == 2 > false
1 == 3 > false
2 == 0 > false
2 == 1 > false
2 == 3 > false
3 == 0 > false
3 == 1 > false
3 == 2 > false
#Test2 [equals]
0 equals 1 > true
0 equals 2 > false
0 equals 3 > true
1 equals 0 > true
1 equals 2 > false
1 equals 3 > true
2 equals 0 > false
2 equals 1 > false
2 equals 3 > false
3 equals 0 > true
3 equals 1 > true
3 equals 2 > false
#Test3 [compareTo]
0 compareTo 1 > true
0 compareTo 2 > true
0 compareTo 3 > true
1 compareTo 0 > true
1 compareTo 2 > true
1 compareTo 3 > true
2 compareTo 0 > true
2 compareTo 1 > true
2 compareTo 3 > true
3 compareTo 0 > true
3 compareTo 1 > true
3 compareTo 2 > true
#Test4 [toString.equals]
0 toString 1 > true
0 toString 2 > false
0 toString 3 > true
1 toString 0 > true
1 toString 2 > false
1 toString 3 > true
2 toString 0 > false
2 toString 1 > false
2 toString 3 > false
3 toString 0 > true
3 toString 1 > true
3 toString 2 > false
#Test5 [doubleValue]
0 doubleValue 1 > true
0 doubleValue 2 > true
0 doubleValue 3 > true
1 doubleValue 0 > true
1 doubleValue 2 > true
1 doubleValue 3 > true
2 doubleValue 0 > true
2 doubleValue 1 > true
2 doubleValue 3 > true
3 doubleValue 0 > true
3 doubleValue 1 > true
3 doubleValue 2 > true
# 測試數值1.01234
------------------------------------------------------------
0 : java.math.BigDecimal@201f9[intVal=<null>,scale=5]
1 : java.math.BigDecimal@1cf8583[intVal=10123400000000000176214598468504846096038818359375,scale=49]
#Test1 [==]
0 == 1 > false
1 == 0 > false
#Test2 [equals]
0 equals 1 > false
1 equals 0 > false
#Test3 [compareTo]
0 compareTo 1 > false
1 compareTo 0 > false
#Test4 [toString.equals]
0 toString 1 > false
1 toString 0 > false
#Test5 [doubleValue]
0 doubleValue 1 > true
1 doubleValue 0 > true
總結
以上是生活随笔為你收集整理的關於BigDecimal的比較的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机指环扣的粘贴位置在哪
- 下一篇: DLSSTweaks 带来新工具:为支持