本人前段時間做一個社區電商應用,發現了一個 天坑 ...................讓我哭會 。 下麵聽聽我的踩坑之路吧 ,電商肯定跟¥打交道了,計算少不了的。由於本人太菜 單純的以為 float double 可以直接參与加減乘除 感覺這種代碼萬無一失沒去想這麼多直接 float*int 。 ...
本人前段時間做一個社區電商應用,發現了一個 天坑 ...................讓我哭會 。 下麵聽聽我的踩坑之路吧 ,電商肯定跟¥打交道了,計算少不了的。由於本人太菜 單純的以為 float double 可以直接參与加減乘除 感覺這種代碼萬無一失沒去想這麼多直接 float*int 。 之前簡單測試沒問題,項目上線後自己偶然才發現的(不知道公司測試幹嘛的) ,當選擇多件商品時 , 還是直接說現象吧 比如 在代碼中 0.1 f * A A為int 型 當A = 1結果沒錯 但是 慢慢增大 到 A = 9 的時候 結果等於 0.9000000.(多少0忘了)...4 ,這就尷尬了 當時一臉蒙逼 後來百度查了一下說 浮點型精度不准什麼的 , 反正我這個菜鳥不怎麼動 , 但是人家有瞭解決方法這是重點.... 所以以後千萬不要隨便拿浮點型進行運算 ,尤其是涉及金額的。不說了 我把運算的工具類貼出來吧 ,趁老闆還沒發現 趕緊更新掉。
工具類如下:
/**
* @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%準確 不會出現多餘小數位數。