你所不知道的JAVA浮點數運算

你所不知道的JAVA浮點數運算

項目中遇到一個奇怪的問題,大家都知道JAVA中的浮點數,但是浮點數的運算我估計誰都沒有深究。
下面先把問題拋出來,假如我想把一個爲“32.33”的float類型浮點數轉成String,如何處理?

很多人會說,So easy!!我給你列出幾種方法:

float v = 326666.43f;
System.out.println("" + v);
System.out.println(String.valueOf(v));
System.out.println(Float.toString(v));

你以爲這樣可行嗎?其實運行一下,結果是:

326666.44
326666.44
326666.44

然後,你可能會說,真是小學生,不知道浮點運算要用BigDecimal嗎!!
於是改成如下:

BigDecimal decimal = new BigDecimal(v);
System.out.println(decimal.toString());

那麼運行結果是什麼呢?看看吧:

326666.4375

後面多了兩位是吧,那是不是要加上小數位限制,但是你想,如果加上小數位限制,是不是要四捨五入,旦你四捨五入,結果是不是還是326666.44!!

好吧,還有一種方法,我們來試一下DecimalFormat,格式化它:

DecimalFormat df = new DecimalFormat("#.##");
System.out.println(df.format(v));

限制兩位小數,結果如下:

326666.44

很可惜,還是不行!

其實,浮點數本身就不是精確的,現在我們卻要用它進行精確運算,這就必需要用到JDK提供的BigDecimal類,你也許會說,我們上面已經用了這個類了,結果還是不行啊!

不是不行,其實是這樣的,上面我們使用BigDecimal時,傳入了一個float類型的參數,錯就錯在這裏,JDK中已經明確說明,浮點數作爲BigDecimal類的參數時,還是無法得到準確的數據!
這裏寫圖片描述

JDK建議使用參數類型是String!!!
JDK建議使用參數類型是String!!!
JDK建議使用參數類型是String!!!

改成Stirng參數:

   BigDecimal d = new BigDecimal("326666.43");
   System.out.println(d.toString());

的結果如下:

326666.43

所以,我錯了,我還是太年輕了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章