我必须将我的结果舍入到最近的fo 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;
}发布于 2011-11-18 14:22:32
一个更短的功能就是去做。
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)
发布于 2011-11-18 13:22:45
问题是,您正在尝试执行对十进制数字感兴趣的操作。这不适合二进制浮点类型。您应该使用BigDecimal,它是基于十进制的表示形式.
就像你想知道为什么你现在的计划行不通一样,如果你写:
double d = 0.1;d的值实际上不是0.1 --它是与0.1最接近的64位IEEE754二进制浮点值。它的值将非常接近于0.1,但不会是0.1。
https://stackoverflow.com/questions/8182994
复制相似问题