我必须将我的结果四舍五入到最接近的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;
}
答案 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)