2011-11-18 132 views
1

我必须将我的结果四舍五入到0.05即(6.34到6.35和6.37到6.4) 所以我创建了myRound函数。 当我写测试看功能,它失败。在JAVA双精度

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; 

} 
+4

使用'BigDecimal' –

+2

阅读http://floating-point-gui.de/以了解问题的根源和可能的修复方法。 –

回答

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)

+0

这解决了我的问题 – vrbilgi

3

的问题是,你要执行哪个有兴趣十进制数字操作。这与浮点类型的二进制不太吻合。您应该使用BigDecimal,这是一个基于十进制的表示形式。

正如为什么你目前的方案是行不通的,如果你写了一个想法:

double d = 0.1; 

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