为什么我无法获得正确的精度?

时间:2014-12-17 09:33:33

标签: java

这是我的sqrt功能。我想以特定的精度输出double值。 但是我得到了这个输出:“0.5的sqrt是:0.7071069999999999” 奇怪的是,当我调试时,longResult是707107

public static double precision = 0.000001;

// the main sqrt function using binary search
public static double Cal(double input){
    if(input < 0) return -1;
    if(input == 0 || input == 1) return input;

    // the sqrt value shall be between 0 ~ input. we use 二分法 to search for the value;
    double min = 0;
    double max = input;
    if(input < 1) {
        min = input;
        max = 1;
    }

    double mid = 0;

    while(max - min > precision){
        mid = (min + max) / 2;
        if(mid * mid == input) return mid;
        else if(mid * mid < input) min = mid;
        else max = mid;
    }
    long longResult = (long)((max + min) / 2 / precision);
    return longResult * precision;
}

public void Test(){
    double input = 0.5;
    System.out.println(String.format("the sqrt of %s is: %s", input,Sqrt.Cal(input)));
}

2 个答案:

答案 0 :(得分:0)

因为IEEE-754双精度浮点数不是很精确。

答案 1 :(得分:0)

来自即将发生的变化 Java Puzzlers:

  

避免使用FloatDouble   答案是必需的

而是使用BigDecimalintlong代替

  

将double转换为BigDecimal,它是double的二进制浮点值的精确十进制表示。