Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我不能得到正确的精度?_Java - Fatal编程技术网

Java 为什么我不能得到正确的精度?

Java 为什么我不能得到正确的精度?,java,Java,这是我的sqrt函数。我想输出具有特定精度的双精度值。 但是我得到了这个输出:0.5的sqrt是:0.7071069999999 奇怪的是,当我调试时,结果是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;

这是我的sqrt函数。我想输出具有特定精度的双精度值。 但是我得到了这个输出:0.5的sqrt是:0.7071069999999 奇怪的是,当我调试时,结果是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)));
}

因为IEEE-754双精度浮点数并不完全精确。

一个变化将带来Java难题:

避免浮动和双精度 需要回答

而是使用BigDecimal、int或long

将double转换为BigDecimal,BigDecimal是双精度二进制浮点值的精确十进制表示形式


如果你对正确的计算感兴趣,请阅读这里,使用BigDecimal,它也有精度,在打印方法时。谢谢,我已经找到了一个解决方法,使用精度的反转值来进行计算。