解決java float double 浮點型參與計算失精度

本人前段時間作一個社區電商應用,發現了一個 天坑   ...................讓我哭會 。 下面聽聽個人踩坑之路吧 ,電商確定跟¥打交道了,計算少不了的。因爲本人太菜 單純的覺得  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%準確 不會出現多餘小數位數。
相關文章
相關標籤/搜索