解决java float double 浮点型参与计算失精度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决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%准确 不会出现多余小数位数。
















































以上是关于解决java float double 浮点型参与计算失精度的主要内容,如果未能解决你的问题,请参考以下文章

Java中浮点类型的精度问题 double float

在java中的double和float类型数据相除为啥可以除以零

浮点型

浮点型变量/常量

#私藏项目实操分享# Java实战系列「技术盲区」Double与Float的坑与解决办法以及BigDecimal的取而代之!

浮点类型说明浮float,double有啥区别啊