解决java float double 浮点型参与计算失精度
本人前段时间做一个社区电商应用,发现了一个 天坑 ...................让我哭会 。 下面听听我的踩坑之路吧 ,电商肯定跟¥打交道了,计算少不了的。由于本人太菜 单纯的以为 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%准确 不会出现多余小数位数。
相关推荐
cmsmdn 2020-04-26
xcguoyu 2019-10-19
xhqiang 2019-06-26
x青年欢乐多 2018-08-04
ddsdevgroup 2013-08-10
LearningMySQL 2019-04-16
pythoning 2019-04-14
pythonjw 2018-12-25
iamlazyphper 2014-03-11
yunfeitian 2020-04-18
Accpcjg 2020-02-26
qingsongzdq 2020-02-01
qingsongzdq 2020-01-07
徐建岗网络管理 2019-12-31
ithzhang 2019-12-26
futurezone 2011-06-25