目錄
目錄
一、什么是小數(shù)
二、浮點數(shù)在計算機中的轉(zhuǎn)換規(guī)則
(1)整數(shù)部分轉(zhuǎn)換步驟
(2) 小數(shù)部分轉(zhuǎn)換步驟
三、使用代碼說明
四、手動轉(zhuǎn)換小數(shù)
五、解決辦法
一、什么是小數(shù)
? ? ? ? 在計算機中,也稱小數(shù)為浮點數(shù),因為在使用科學計數(shù)法時,數(shù)字的小數(shù)點是可以“浮動”的。
? ? ? ? 在Java中,關(guān)于浮點數(shù)有兩種數(shù)據(jù)類型:
Float | Double | |
含義 | 單精度浮點數(shù) | 雙精度浮點數(shù) |
Java中的默認值 | 不是默認浮點數(shù)類型 | 是默認浮點數(shù)類型 |
Java中所占字節(jié)數(shù) | 4字節(jié) | 8字節(jié) |
最大值 | 3.4E38 |
1.79E308 |
二、浮點數(shù)在計算機中的轉(zhuǎn)換規(guī)則
? ? ? ? 數(shù)字在計算機中是采用二進制存儲的,在將小數(shù)存入計算機中時,要將十進制轉(zhuǎn)為二進制,最后呈現(xiàn)給我們的是二進制在重新轉(zhuǎn)換為十進制的結(jié)果。而在十進制轉(zhuǎn)換為二進制的過程中,極易出現(xiàn)無限循環(huán)的情況,因此小數(shù)將變得不再精確。計算機最終會取一個無限接近結(jié)果的小數(shù)作為結(jié)果。
????????十進制數(shù)轉(zhuǎn)換為二進制數(shù)時,需要對整數(shù)部分與小數(shù)部分分別進行轉(zhuǎn)換。
(1)整數(shù)部分轉(zhuǎn)換步驟
????????1.使用十進制的值除以2,得到兩個部分,商和余數(shù);
????????2.商繼續(xù)除以2,直到商為0為止;
????????3.余數(shù)倒著看,就是二進制的值。
(2) 小數(shù)部分轉(zhuǎn)換步驟
????????1.整數(shù)部分轉(zhuǎn)整數(shù)部分,小數(shù)部分轉(zhuǎn)小數(shù)部分;
????????2.把十進制的小數(shù)乘以2:
? ? ? ? ????????(1).結(jié)果如果大于1,轉(zhuǎn)換后的小數(shù)后面記1;
? ? ? ? ????????(2).結(jié)果如果小于1,轉(zhuǎn)換后的小數(shù)后面記0。
????????3.直到結(jié)果為1.0為止。
三、使用代碼說明
public class Demo01 {
public static void main(String[] args) {
double x = 10 - 9.9;
double y = 1.0 - 9.0 / 10;
//觀察x和y是否相等:
System.out.println(x);
System.out.println(y);
//判斷x和y是否相等
System.out.println(x == y);
System.out.println(Math.abs(x - y) < 0.000001); //Math.abs()取絕對值
}
}
? ? ? ? 運行結(jié)果:
? ? ? ? ?我們發(fā)現(xiàn),在日常計算中,x與y的值應該是相等的,但是使用浮點數(shù)進行除法運算后,就已經(jīng)將值變得不精確了,因此,兩個算式的最終結(jié)果不一致,并且相差很小。
四、手動轉(zhuǎn)換小數(shù)
? ? ? ? 將十進制數(shù)0.6轉(zhuǎn)換為二進制數(shù)
? ? ? ? 我們發(fā)現(xiàn),這里出現(xiàn)了循環(huán),因此浮點數(shù)是不精確的。
五、解決辦法
? ? ? ? 使用BigDecimal類,舉例代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-474410.html
public class Demo02 {
public static void main(String[] args) {
System.out.println("============直接計算============");
System.out.println("0.1 × 0.2 = " + 0.1 * 0.2);
System.out.println("=====使用BigDecimal + 字符串=====");
BigDecimal d1 = new BigDecimal("0.1");
BigDecimal d2 = new BigDecimal("0.2");
BigDecimal d3 = d1.multiply(d2);
double result = d3.doubleValue();
System.out.println("0.1 × 0.2 = " + result);
}
}
? ? ? ? 運行結(jié)果如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-474410.html
============直接計算============
0.1 × 0.2 = 0.020000000000000004
=====使用BigDecimal + 字符串=====
0.1 × 0.2 = 0.02
到了這里,關(guān)于【Java se】為什么大部分小數(shù)在計算機中是不精確的的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!