你所不知道的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
所以,我錯了,我還是太年輕了