浮點數,BigDecimal
浮點數
電腦目前以IEEE-754為標準,由於要將小數表示為二進位,在顯示某些小數會有除不盡的問題,
以Java來說使用BigDecimal來處理這方面的問題。
public static void main(String[] args) {
double a = 1;
double b = 0.9;
double c = 0.8;
double d = 0.7;
System.out.println(a-b);//0.09999999999999998
System.out.println(a-c);//0.19999999999999996
System.out.println(a-d);//0.30000000000000004
}
BigDecimal
- Constructor以double作為參數會有問題,請參考官方API Note說明
- equals是需要連同精度都相同,2.0與2.00是為不同,請參考官方API說明
- compareTo不需連精度都相同,2.0與2.00為相同,請參考官方API說明
- RoundingMode設定請看官方文件,中文說明請看openhome 的不同進位捨法說明
public static void main(String[] args) {
BigDecimal a = new BigDecimal(0.1);
System.out.println(a);//0.1000000000000000055511151231257827021181583404541015625
BigDecimal b = new BigDecimal("100.00");
BigDecimal c = new BigDecimal("100");
System.out.println(b.equals(c));//false
System.out.println(b.compareTo(c));//0
}
Reference: