首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

double运算的精度有关问题

2013-07-11 
double运算的精度问题import java.math.BigDecimalpublic class TestDouble {public static void main(St

double运算的精度问题


import java.math.BigDecimal;

public class TestDouble {
public static void main(String[] args) {
double d1 = div(20130708154752d,1000000000000d);
double d2 = 16000d;
System.out.println(d1);
System.out.println(sum(d1,d2));
}

public static 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();
}

public static double div(double v1,double v2){
        return div(v1,v2,12);
    }

public static double div(double v1,double v2,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}



运行结果是:
20.130708154752
16020.130708154751

如何能避免精度损失的问题? double?精度?运算
[解决办法]
只能不用double了
[解决办法]
一直用BigDecimal,结果是准确的。
用double转其他类型的时候,已经存在误差了。
[解决办法]
b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();divide提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入(BigDecimal.ROUND_HALF_UP)。

你说的损失是存在的。
------解决方案--------------------


精度损失,几乎无法避免,只能控制在某个范围内。
例如,财会做账,我们通常以分为单位,而不是元,这样避免浮点数的精度损失。
但是,如果做平均数、方差之类的运算 ,还是会产生精度损失,这时就只能控制精度。
BigDecimal 是高精度的浮点数,通过这个类封装过后,可以处理高精度的数字。

计算机存储的是二进制数字,所以,保存十进制数据时,有时候也会产生误差。
所以,我们应该关注误差的大小,控制在我们能接收的范围就好。
还要注意误差传递的问题。

热点排行