Java 为什么我不能得到正确的精度?
这是我的sqrt函数。我想输出具有特定精度的双精度值。 但是我得到了这个输出:0.5的sqrt是:0.7071069999999 奇怪的是,当我调试时,结果是707107Java 为什么我不能得到正确的精度?,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;
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,它也有精度,在打印方法时。谢谢,我已经找到了一个解决方法,使用精度的反转值来进行计算。