注意Java中?new?BigDecimal(double?val)?的使用
前言:
今天下午跑單元測(cè)試報(bào)錯(cuò),發(fā)現(xiàn)一個(gè)關(guān)于 new BigDecimal(double val) 的代碼問(wèn)題,總結(jié)下。
問(wèn)題
業(yè)務(wù)代碼:
/** * 校驗(yàn)價(jià)格是否一致 * * @param frontPrice 前端商品價(jià)格 * @param realPrice 商品系統(tǒng)價(jià)格 * @return boolean true 相等 */ public static boolean comparePrice(BigDecimal frontPrice, BigDecimal realPrice) { ? ?return frontPrice.compareTo(realPrice) == 0; }
測(cè)試代碼:
/** * 前端價(jià)格 */ BigDecimal forntPrice = new BigDecimal(0.2);
然后測(cè)試 comparePrice 方法總是返回 false,frontPrice 和 realPrice 明明是相等的, 都是0.2。
經(jīng)過(guò)斷點(diǎn)排查問(wèn)題發(fā)現(xiàn) frontPrice 的值不是 0.2,而是 0.200000000000000011102230246251565404236316680908203125 。
我靠,怎么出現(xiàn)這種情況,BigDecimal 不是精準(zhǔn)運(yùn)算的嗎?
解決
查看相關(guān)文檔:
簡(jiǎn)單翻一下:
將 double 類型轉(zhuǎn)換成 BigDecimal 類型。
- 這個(gè)構(gòu)造函數(shù)的結(jié)果在某種程度上是不可預(yù)測(cè)的。你可能會(huì)覺(jué)得
new BigDecimal(0.1)
會(huì)創(chuàng)建一個(gè)剛好等于 0.1 的 BigDecimal,但它實(shí)際上等于 0.1000000000000000055511151231257827021181583404541015625 。這是因?yàn)?0.1 不能被精確地表示為一個(gè)雙精度數(shù)。 - String 構(gòu)造函數(shù)是完全可預(yù)測(cè)的,
new BigDecimal("0.1")
會(huì)創(chuàng)建一個(gè)完全等于 0.1 的 BigDecimal,建議優(yōu)先使用 String 構(gòu)造函數(shù)。 - 如果必須使用 double 作為轉(zhuǎn)換源時(shí),可以使用
BigDecimal.valueOf(0.1)
,它返回的結(jié)果也是精確的。
總結(jié)
將 double 類型轉(zhuǎn)換為 BigDecimal 類型的時(shí)候,不要使用new BigDecimal(0.1)
這個(gè)構(gòu)造函數(shù),應(yīng)為它得到的結(jié)果是不精確的,
使用BigDecimal.valueOf(0.1)
或new BigDecimal("0.1")
。
使用 IDEA 編碼的時(shí)候會(huì)給警告提示:
到此這篇關(guān)于注意Java中 new BigDecimal(double val) 的使用的文章就介紹到這了,更多相關(guān)Java new BigDecimal內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)簡(jiǎn)單的日歷界面
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的日歷界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06詳解spring mvc4使用及json 日期轉(zhuǎn)換解決方案
本篇文章主要介紹了spring mvc4使用及json 日期轉(zhuǎn)換解決方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01SpringCloud集成Hystrix熔斷過(guò)程分步分解
通過(guò)hystrix可以解決雪崩效應(yīng)問(wèn)題,它提供了資源隔離、降級(jí)機(jī)制、融斷、緩存等功能。接下來(lái)通過(guò)本文給大家分享SpringCloud集成Hystrix熔斷,感興趣的朋友一起看看吧2022-09-09從零構(gòu)建可視化jar包部署平臺(tái)JarManage教程
這篇文章主要為大家介紹了從零構(gòu)建可視化jar包部署平臺(tái)JarManage教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05WebClient拋UnsupportedMediaTypeException異常解決
這篇文章主要為大家介紹了WebClient拋UnsupportedMediaTypeException異常的解決方案,文中給大家介紹了六中方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02Java的DataInputStream和DataOutputStream數(shù)據(jù)輸入輸出流
這里我們來(lái)看一下Java的DataInputStream和DataOutputStream數(shù)據(jù)輸入輸出流的使用示例,兩個(gè)類分別繼承于FilterInputStream和FilterOutputStream:2016-06-06