public class A {
static boolean equal(float a, float b) {
return a == b;
}
public static void main(String[] args) {
System.out.println(equal(3.14159267f,3.14159268f));//结果为true
double d = 2.0;
double d2 = 1.1;
System.out.println(d - d2);//结果为0.8999999999999999
}
}
为什么是上面的结果?
static boolean equal(float a, float b) {
return a == b;
}
public static void main(String[] args) {
System.out.println(equal(3.14159267f,3.14159268f));//结果为true
double d = 2.0;
double d2 = 1.1;
System.out.println(d - d2);//结果为0.8999999999999999
}
}
为什么是上面的结果?
float是占4个字节的,最大精度是小数点后面7位,如果想知道具体是怎么弄的可以去网上查查相关资料,(我一般都不关心这个具体原理,可能我是个比较蠢的程序员吧)。所以自然为true了
比如计算机做2.0/3的时候在底层是怎么做的呢?先将数转化为浮点数,然后用CPU中的除法器做的(根据不同的CPU有不同的实现方法),像这种浮点数的运算在最后一位的时候都会遇到取舍,更具不同的取舍方法,得到的结果有可能不一样的。不仅如此,在二进制数与浮点数的转换中间也肯定会有取舍的。相信通过bytecode传过去的数也是通过vm再传到cpu这样算的,所以呢~~~~解决方案:用java实现浮点数的精确计算
static boolean equal(float a, float b) {
return a == b;
}
public static void main(String[] args) {
System.out.println(equal(3.14159267f,3.14159268f));//float 型数精确到小数点后7位,7位以后不在计算
double d = 2.0;
double d2 = 1.1;
System.out.println(d - d2);//结果为0.8999999999999999 这个也不知道是咋回事把double改成float就行了,应该也是精度问题
}
}