小編給大家分享一下Java中NumberFormat格式化float類型bug的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
首先,這個NumberFormat這個類,可以格式化各種數字。你只要稍微設置一下,結果還是很理性的。
但是,他有那么一丟丟的bug,不知道你知道不?
/** * 2.3F經過格式化,竟然變成2.99啦。what the fuck . * float類型的時候,值是2.3,但是一經變成Double,值就變成2.99999啦。 * 這個format的參數是double類型的。所以,在傳入參數的時候,就變成了對2.299999952316284進行操作。返回就過就是2.99 */ private static void floatFormatTest() { float responseTime = 2.3F; NumberFormat formatter; formatter = NumberFormat.getNumberInstance(); formatter.setGroupingUsed(false); formatter.setRoundingMode(RoundingMode.FLOOR); formatter.setMaximumFractionDigits(2); String format = formatter.format(responseTime); System.out.println(format); float v = Float.parseFloat(formatter.format(responseTime)); System.out.println(v); }
看下debug的時候,這個數字到底有啥出乎意料的變化。
這個時候,還是OK的。還是正常的。
看到啦沒,這個2.3F,float類型的數,經過format的時候,自動變成double類型啦。然后,就不穩定啦。
經過取舍之后,2.3,就變成啦2.29啦
怎么規避這個問題
在使用這個BigDecimal
的時候,傳參數,要傳字符串。不然還是不準確。
以上是“Java中NumberFormat格式化float類型bug的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。