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略有不同(因为用二进制表示小数的问题)

这里有一个关于浮点数的好方法。

其他类似问题可能重复:,