这是我的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)));
}
答案 0 :(得分:0)
因为IEEE-754双精度浮点数不是很精确。
答案 1 :(得分:0)
来自即将发生的变化 Java Puzzlers:
避免使用
Float
和Double
答案是必需的
而是使用BigDecimal
,int
或long
代替
将double转换为BigDecimal,它是double的二进制浮点值的精确十进制表示。