單精度浮點數
單精度浮點數最高可精確到1/2^24,也就是1/16777216,什么意思呢?就是說16777216與16777217,如果用單精度浮點數來表示,其結果是一樣的。以下Java代碼可直觀看到精度損失。
/**
* @description: 測試單精度浮點數精度
* @author: banmao
* @date: 2022/1/13 12:32
*/
public class TestFloat {
public static void main(String[] args) {
int i = 123456789;
float f = i;
System.out.println(f); // 輸出為1.23456792E8
}
}
為什么會損失精度呢?這個首先需要了解計算機中的浮點數是怎么存儲的,可閱讀計算機中存儲整數、小數與字符串
這里簡要說明下,因為計算機存儲小數是通過科學計數法來存儲的,有效位為23位,精度為24位,而上面代碼中的示例的整數為123456789,轉換成32位的二進制為111010110111100110100010101
,取前24位10000010(指數) 111010110111100110100010(有效數)
,舍入處理為10000010(指數為3) 111010110111100110100011
,其實也就是111010110111100110100011000
,得出的十進制為123456792
,這就是導致精度損失的原因。
雙精度浮點數
雙精度浮點數的有效數位為52位,精度為53位,於是雙精度浮點數可精確到1/2^53,也就是1/9007199254740991。
總結
1、單精度浮點數最高精確到1/16777216,雙精度浮點數最高精確到1/9007199254740991
2、整數轉浮點數可能會丟失精度,在Java中,int->float,long->float,long->double,這三種轉換可能會造成精度損失。
擴展
1.BigDecimal對於精度損失有作用嗎?