本人前段時間作一個社區電商應用,發現了一個 天坑 ...................讓我哭會 。 下面聽聽個人踩坑之路吧 ,電商確定跟¥打交道了,計算少不了的。因爲本人太菜 單純的覺得 float double 能夠直接參與加減乘除 感受這種代碼萬無一失沒去想這麼多直接 float*int 。 以前簡單測試沒問題,項目上線後本身偶然才發現的(不知道公司測試幹嗎的) ,當選擇多件商品時 , 仍是直接說現象吧 好比 在代碼中 0.1 f * A A爲int 型 當A = 1結果沒錯 可是 慢慢增大 到 A = 9 的時候 結果等於 0.9000000.(多少0忘了)...4 ,這就尷尬了 當時一臉蒙逼 後來百度查了一下說 浮點型精度不許什麼的 , 反正我這個菜鳥不怎麼動 , 可是人家有了解決方法這是重點.... 因此之後千萬不要隨便拿浮點型進行運算 ,尤爲是涉及金額的。不說了 我把運算的工具類貼出來吧 ,趁老闆還沒發現 趕忙更新掉。java
工具類以下:ide
/** * @author Mr_Peng * @created at 2017/6/9 10:13. * @describe: java 精度運算 */public class ArithUtil { private static final int DEF_DIV_SCALE=10; private ArithUtil(){} public static double add(double d1,double d2){ BigDecimal b1=new BigDecimal(Double.toString(d1)); BigDecimal b2=new BigDecimal(Double.toString(d2)); return b1.add(b2).doubleValue(); } public static double sub(double d1,double d2){ BigDecimal b1=new BigDecimal(Double.toString(d1)); BigDecimal b2=new BigDecimal(Double.toString(d2)); return b1.subtract(b2).doubleValue(); } public static double mul(double d1,double d2){ BigDecimal b1=new BigDecimal(Double.toString(d1)); BigDecimal b2=new BigDecimal(Double.toString(d2)); return b1.multiply(b2).doubleValue(); } public static double div(double d1,double d2){ return div(d1,d2,DEF_DIV_SCALE); } public static double div(double d1,double d2,int scale){ if(scale<0){ throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1=new BigDecimal(Double.toString(d1)); BigDecimal b2=new BigDecimal(Double.toString(d2)); return b1.divide(b2,scale, BigDecimal.ROUND_HALF_UP).doubleValue(); }}證實:真實有效 ,運算結果100%準確 不會出現多餘小數位數。