java程序输出的解释
我遇到了以下程序java程序输出的解释,java,boolean,Java,Boolean,我遇到了以下程序 class Boolean { public static void main(String argv[]) { boolean x; x = 4.4f == 4.4; System.out.println(x); } } 以下程序的输出为false 但是如果我们按照下面的方式编写程序 class Boolean { public static void main(String argv[]) {
class Boolean {
public static void main(String argv[]) {
boolean x;
x = 4.4f == 4.4;
System.out.println(x);
}
}
以下程序的输出为false
但是如果我们按照下面的方式编写程序
class Boolean {
public static void main(String argv[]) {
boolean x;
x = 4.5f == 4.5;
System.out.println(x);
}
}
在这种情况下,输出为true
有人能解释一下为什么???这是因为当双精度被截断为浮点值时出现了舍入错误。有时你会得到,有时你不会
4.4f是一个浮点数,4.4是一个双精度。问题是计算机喜欢以2为基数的数字,而不是像我们这样以10为基数的数字 4.4在二进制中是一个无限分数(对我们来说是0.333333…),浮点数的位数少于双精度数,因此4.4f中的位数少于4.4中的位数,这使它们有所不同 4.5不是一个无限的分数
注意:当您需要比较浮点或双精度时,您应该始终检查差异的大小,而不仅仅是检查是否相等 PRGRAM将16位浮点值与32位双精度值进行比较。在内部,它表示为a,因此差异是一个舍入误差,在某些情况下,由于精度不同,导致这种不平等。这是因为浮点不是双精度,并且您无法轻松进行直接比较,因为浮点只是一个近似值。请看下面的代码:
public static void main(String args[]) {
double a, b;
a = 4.4f;
b = 4.5f;
System.out.println("4.4f implicitly cast to a double = "+a);
System.out.println("4.5f implicitly cast to a double = "+b);
}
您将看到,当隐式转换为double时,4.4f实际上是4.400000095367432。运行此代码以了解在这些情况下如何将float转换为double
NumberFormat nf = new DecimalFormat("0.00000000000000000000");
System.out.println(nf.format(4.4f));
System.out.println(nf.format(4.4));
System.out.println(nf.format(4.5f));
System.out.println(nf.format(4.5));
除了大家都说过的,这里还有一个非常流行的例子来演示浮点运算
System.out.println(0.3 - 0.2 - 0.1);
它不会打印
0
。事实上,当某些分数在二进制表示中不终止重复时,由于浮点运算中发生截断错误,它将打印一个非常小的数字。通常不应将浮点值与==运算符进行比较。您应该使用“足够接近”比较,例如检查值是否相差较小的值:
双ε=0.000001
布尔相等=数学.abs(value1-value2)
在您的示例中,4.4f不等于4.4,因为java将浮点值默认为double类型,即64位,要将它们进行比较,java将4.4f转换为double,这导致它与原始的double值4.4略有不同(因为用二进制表示小数的问题)
这里有一个关于浮点数的好方法。其他类似问题可能重复:,