java double数据类型运算问题

double a = 5.0;
double b = 0.1;

double c = 0.1;

System.out.println(a+b+c); //为什么结果是5.199999999999999,不应该是5.200000000000000吗?

使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。
特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。
这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错。
所以一般对double类型进行运算时,做好对结果进行处理,然后拿这个值去做其他事情。

目前总结如下:

/**

* 对double数据进行取精度.

* @param value double数据.

* @param scale 精度位数(保留的小数位数).

* @param roundingMode 精度取值方式.

* @return 精度计算后的数据.

*/

public static double round(double value, int scale,

int roundingMode) {

BigDecimal bd = new BigDecimal(value);

bd = bd.setScale(scale, roundingMode);

double d = bd.doubleValue();

bd = null;

return d;

}

/**
* double 相加
* @param d1
* @param d2
* @return
*/
public double sum(double d1,double d2){
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.add(bd2).doubleValue();
}

/**
* double 相减
* @param d1
* @param d2
* @return
*/
public double sub(double d1,double d2){
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.subtract(bd2).doubleValue();
}

/**
* double 乘法
* @param d1
* @param d2
* @return
*/
public double mul(double d1,double d2){
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.multiply(bd2).doubleValue();
}

/**
* double 除法
* @param d1
* @param d2
* @param scale 四舍五入 小数点位数
* @return
*/
public double div(double d1,double d2,int scale){
// 当然在此之前,你要判断分母是否为0,

// 为0你可以根据实际需求做相应的处理

BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.divide

(bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}

这样,计算double类型的数据计算问题就可以处理了。
另外补充一下 JavaScript 四舍五入的方法:
小数点问题

Math.round(totalAmount*100)/100 (保留 2 位)

function formatFloat(src, pos)
{
return Math.round(src*Math.pow(10, pos))/Math.pow(10, pos);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-12-18
浮点数值没办法用十进制来精确表示的原因要归咎于CPU表示浮点数的方法。这样的话您就可能会牺牲一些精度,有些浮点数运算也会引入误差。以上面提到的情况为例,2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。原因在于浮点数由两部分组成:指数和尾数。浮点数的值实际上是由一个特定的数学公式计算得到的。您所遇到的精度损失会在任何操作系统和编程环境中遇到。float类型的变量只有7位的精度,而double类型的变量有15位的精度
第2个回答  2014-12-18
使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。 这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错。

解决方法有:
//方法一
NumberFormat nFormat=NumberFormat.getNumberInstance();
nFormat.setMaximumFractionDigits(2);//设置小数点后面位数为
System.out.println(nFormat.format(3.1415););
/*
方法二
double d = 14.7155;
DecimalFormat df0 = new DecimalFormat("###");
DecimalFormat df1 = new DecimalFormat("###.0");
DecimalFormat df2 = new DecimalFormat("###.00");
System.out.println(df0.format(d));
System.out.println(df1.format(d));
System.out.println(df2.format(d));
double test = Math.round(d);
System.out.println(test);
*/
第3个回答  2014-12-18
这个就是double的精度问题啊?
java.math.BigDecimal

double n=0.01;
double m=0.06;
java.math.BigDecimal d1=new java.math.BigDecimal(String.valueOf(n));
java.math.BigDecimal d2=new java.math.BigDecimal(String.valueOf(m));

System.out.println(d1.add(d2).doubleValue());

java中double类数据运算精度不准怎么解决呢?
1. **使用BigDecimal类**:对于需要高精度的算术运算,尤其是涉及货币、分数等场景,BigDecimal是一个很好的选择。它允许你设置精度和四舍五入策略,确保计算结果的准确性。2. **避免直接比较**:在处理double时,直接使用`==`或`!=`进行比较可能导致错误结果。由于double精度问题,即使看起来相等的两...

java中double类型数据加减操作精度丢失问题及解决方法
首先,需要明白的是,Java中的double和float类型用于表示近似数值,它们在进行运算时可能会因舍入误差而产生精度丢失。因此,在进行商业计算或要求精确度较高的计算时,应避免使用double和float,而是选择Java.math.BigDecimal类。BigDecimal类提供了多种构造方法,其中两个最为常用的是:BigDecimal(double val...

java double转int出错
Java中的double转int问题主要源于类型转换的规则。当你试图将double类型的值除以一个int类型的值,如double value = result.size() \/ term,如果term为int类型,那么整个表达式的结果会被隐式转换为int,导致可能出现意外的结果。例如,5除以3的结果在int类型下是1,而非1.6666...,这在后续的double...

Java 中浮点数的精度丢失问题以及解决方案
在Java中使用double类型进行运算时,精度丢失问题时常出现,结果会与预期略有偏差。这主要是因为计算机使用二进制表示浮点数,而浮点数无法精确用二进制表示,导致运算误差。CPU表示浮点数由指数和尾数两部分组成,这种表示方式会导致精度损失。浮点运算结果很少是精确的,超出精度范围的运算会产生误差,且误差与...

java中double最大值和long最大值为何差
在Java中,double和long数据类型的数值范围有所差异,主要源于double采用了科学计数法来表示大数值。double类型通常在处理非常大的数值时,会选择使用这种计数法,以节省存储空间和运算效率。当一个数被表示为1e308时,这实际上是1乘以10的308次方,这种简洁的表示方式省略了实际数字中的大部分位数。然而,...

在JAVA中,求一个double类型的数据的整数部分的语法是什么
double h=8888.342;String doustr=""+h;String intes=doustr.subString(0,doustr.indexOf("."));int i = Integer.parseInt(intes);

java里面double类型数相除
4和10都是整数int类型的,所以4\/10结果也是int的,就是0,把结果赋值给double类型,才会转换成double,就是0.0d;若果想得到完整的结果0.4,那就需要在除法前先将4或者10转换成double类型 比如(double)4\/10;java中数字的运算是按照double flout long int char byte 的顺序向上靠拢的,比如flout和...

关于javadouble小数向上取整处理
Java中可以使用Math.ceil函数来实现double类型小数的向上取整。详细解释:1. Java中的Math.ceil函数:Java的Math类提供了一个静态方法`ceil`,它可以对传入的double类型数值进行向上取整操作。所谓向上取整,即结果总是比实际数值大或等于的最小整数。例如,对于小数2.3,向上取整的结果就是3。2. 函数...

JAVA程序计算结果出错
原因是因为java 的double类型数据是不精准的 实际开发会用下面api 提供的类 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是...

double 类型是什么意思
double类型是指一种基本数据类型,也是一种浮点类型。它可以存储比float类型更大的数字,并且具有更高的精度。在Java中,double类型默认被赋予双精度,即占用8个字节的存储空间。如果需要处理大量的小数计算或需要更高的精度,使用double类型会更加适合。由于double类型可以存储更大的数字,因此它也具有更广泛...

相似回答