日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

關於BigDecimal的比較

發布時間:2023/12/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 關於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的比較的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。