代碼如下
public class Test {
public static void main(String[] args) {
double a = 0.06;
double b = 0.01 + 0.05;
System.out.println(a == b);
}
}
// 輸出
false
繼續測試代碼
public class Test {
public static void main(String[] args) {
double a = 0.06;
double b = 0.01 + 0.05;
System.out.println(a);
System.out.println(b);
System.out.println(a == b);
}
}
// 輸出
0.06
0.060000000000000005
false
分析原因
類型 | 符號位 | 指數 | 小數 | 總長度 |
---|---|---|---|---|
float | 1 | 8 | 23 | 32 |
double | 1 | 11 | 52 | 64 |
浮點數在java中存儲的形式決定了在java中,浮點數并不是精確的。
先舉個簡單的例子,算算1.0在double中是怎么存儲的
1.0如何在double中存儲
符號位:0 表示正數
指數:0 + 2047 (IEEE標準規定double加2047,float加127)
小數:0
變換成相應的長度,可以寫為:
符號位:0
指數:011 1111 1111
小數:0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
整體為:
0011 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0.1如何在double中存儲
0.1可以寫為
1.0100 0111 1010 1110 0001 0100 0111 1010 1110 0001 0100 0111 1011 * 2 ^ (011 1111 1000 - 2047)
符號位:0 表示正數
指數:011 1111 1000
小數:0100 0111 1010 1110 0001 0100 0111 1010 1110 0001 0100 0111 1011
整體為:0011 1111 1000 0100 0111 1010 1110 0001 0100 0111 1010 1110 0001 0100 0111 1011
可以發現0.1在double中并不是一個精確值,0.5同樣也不是一個精確值,對于2進制來說,它們都是無限循環小數。
所以由于精度的原因,0.01 + 0.05 并不等于0.06