假設我們在做電商項目掉缺,在進行計算時這個丟失精度在產(chǎn)品價格計算就會出現(xiàn)問題偿警,很有可能造成我們手里有9.99元然后后面會有一堆9碰镜,但是呢這些錢無法購買一個10元的商品擎椰。
在某些編程語言中有專門處理貨幣的類型鹅巍,但是Java沒有胸遇,不過沒關系我們可以通過BigDecimal來解決這個問題冕香。
下面我們來看幾個例子夺颤。
testOne
這個呢就是Java本身對于浮點計算的時候會丟失精度,一定要注意枪汪,一定要注意涌穆,它所引起的事情呢基本沒有小事,如果在線上訂購量大的話雀久,會引起大的故障宿稀,可能會導致下不了訂單或是對賬出現(xiàn)問題
testTwo
當使用BigDecimal后結果就更亂了,比test1結果還可怕又長又亂赖捌,它算出來的數(shù)比0.06是多的還是剛才那個意思祝沸,假設我們現(xiàn)在,銀行卡里面有0.06元然后我買的兩個商品巡蘸,分別是0.05元和0.01,當我下單的時候如果沒有做處理那么他需要付的是0.06000000000000000298372437868010820238851010799407958984375這就導致余額不夠擂送,訂單無法下悦荒。這還沒解決,不要緊嘹吨,接著看
testThree
用String的BigDecimal構造器搬味,這個結果就是我們想要的,本身呢BigDecimal這個類型是用它來解決這個問題但是我們在選擇用它的時候蟀拷,一定一定一定要選擇它的String構造器一旦不用就像test2一樣會發(fā)生嚴重過的精度問題碰纬,這個原則在《Effective
Java》這本書中也有說,是說這個原則如果float和double只能用來做科學計算或者工程計算问芬,但是在商業(yè)計算中我們要用BigDecimal悦析。
1.說明
在java.math包中找到API類BigDecimal,然后找到BigDecimal(double)構造方法
源代碼里寫的很明白這個結果和這個構造器就會產(chǎn)生這個種問題它是無限接近于這么一個數(shù)這個構造器呢不是正好的此衅,而是等于0.1
2.用法
如果用這個構造器呢强戴,把它轉成String,用Double的toString(double)挡鞍,里面放double然后用BigDecimal(String)這個String去構造骑歹,也就是說如果要用的話,就把它轉成String然后在選擇用BigDecimal的String構造器去獲得結果墨微。另外3個這里就不講了自己去看;
為了方便我們可以把它寫成一個util類道媚,日后我整理完了會把它放在GitHub上。
轉自:http://www.godql.com/blog/2017/05/17/Precision/