JAVA的双精度

时间:2011-11-18 13:16:02

标签: java double precision

我必须将我的结果四舍五入到最接近的0.05即(6.34到6.35和6.37到6.4)     所以我创建了myRound函数。     当我编写测试来查看函数时,它失败了。

double rate=14.99;
double  percentage=10;
double roundedCost=(rate*percentage)/100; //round off to the nearest value. 
double finalRate = rate+myRound(roundedCost,2);

if(finalRate==16.49)
    System.out.println("Its proper");
else
    System.out.println("Wrong");

原因是双倍的精确值。     如何纠正精确度。

public double myRound(double value,int roundRange)
{
    double hundredMultiple=(float) Math.pow(10, roundRange);
    int rangeValue= (int) (value*hundredMultiple);
    int tempValue= rangeValue%10;
    if(tempValue<5)
        tempValue=5-tempValue;
    else
        tempValue=10-tempValue;
    rangeValue=rangeValue+tempValue;

    return rangeValue/hundredMultiple;

}

2 个答案:

答案 0 :(得分:3)

问题是您正在尝试执行对十进制数字感兴趣的操作。这与二进制浮点类型不太匹配。您应该使用BigDecimal,这是一种基于小数的表示。

如果您写下:

,只是想知道为什么您当前的方案不起作用
double d = 0.1;

d的值不是实际上 0.1 - 它是最接近的64位IEEE 754二进制浮点值到0.1。它的值非常关闭为0.1,但它不会是0.1。

答案 1 :(得分:0)

要做的事情要短得多。

public static double round(double v, int precision) {
     long t = TENS[precision]; // contains powers of ten.
     return (double) (long) (v > 0 ? v * t + 0.5 : v * t - 0.5) / t;
}

这适用于少于18位有效数字(超出精确度)的数字,例如对于2位小数,该数字应小于10 ^ 16。

顺便说一下,你应该总是围绕最后的答案(可能只围绕最后的答案)。这是因为x + round(y, 2)可能不等于round(x + y, 2)