【问题标题】:Float numbers in JavaJava中的浮点数
【发布时间】:2011-02-25 13:05:25
【问题描述】:

谁能请我为什么以下程序的输出不是“不同的不同”?

public static void main(String[] args)
{

float f1=3.2f;
float f2=6.5f;

if(f1==3.2)
System.out.println("same");
else
System.out.println("different");

if(f2==6.5)
System.out.println("same");
else
System.out.println("different");
}

o/p:不同 一样的

【问题讨论】:

    标签: java numbers floating-point


    【解决方案1】:

    This可以帮助理解

    【讨论】:

      【解决方案2】:

      因为 3.2f 是 float 值,而 3.2double 值。浮点数总是有点不准确,因为二进制表示不能准确地实现它们,所以比较它们是否完全相等是一个坏主意。 特别是比较浮点数和双精度数。诸如3.2f == 3.2f 之类的表达式通常是可以的,但即使是那些在某些语言中也可能失败,例如如果它们在寄存器中比在内存中更准确地表示数字。

      【讨论】:

      • +1 因为这个解释比我费心写的要详尽得多。 :)
      • 我认为问题是为什么其中一个应该相等。 OP 希望它们都不平等。
      • “浮点数总是有点不准确”-> 错误。 float 和 double 可以表示具有有限二进制表示的分数,如 6.5 就好了。详情见我的回答。
      • 没错,但是记住哪些小数是准确的,哪些不准确,并基于此使用或避免 == 真的很麻烦 - 事实上,不必记住这些细节就是全部首先要有一个具有明确语义的浮点数据类型!因此,我总是建议人们将所有浮动值视为不准确的,即使技术上有些不是。
      【解决方案3】:

      "3.2f" 是浮点类型。 "3.2" 是双精度类型。

      【讨论】:

        【解决方案4】:

        另外,我认为任何带小数的东西都默认为双精度,所以当您进行比较时,您必须添加“f”以及if(f2==6.4f)

        【讨论】:

          【解决方案5】:

          因为 3.2 不能完全用浮点数表示,而 6.5 是(提示:6.5 = 13 * 2^(-1)),以及 3.2 是 double 文字但 3.2f 是 @ 987654322@ 字面量。

          【讨论】:

            【解决方案6】:

            6.5 有一个有限的二进制表示:110.1

            任何具有至少 4 个有效位的浮点类型都可以完美地表示这个数字。

            110.100000000000000000000(浮点数)
            = 6.5

            110.100000000000000000000000000000000000000000000000000(双)
            = 6.5

            另一方面,3.2 具有无限的二进制表示:101.0011001100110011...

            float 和 double 没有无限精度,因此只能近似这个数字:(

            101.001100110011001100110(浮点数)
            = 3.2000000476837158203125

            101.00110011001100110011001100110011001100110011001101(双)
            = 3.20000000000000017763568394002504646778106689453125

            如您所见,这些数字并不相同!

            【讨论】:

            • +1 给你,因为它是唯一能真正回答问题的答案。我不知道为什么 OP 接受了另一个答案,这绝对不能解释为什么一个测试给出 "same" 和另一个 "different"
            • 我只想补充一点,另一个原因是 Java 将不太精确的类型提升为更精确的类型进行比较,这使得 3.2 和 3.2f 的比较成为可能。如果它在此处截断较长的类型,这些将是相同的,但值得庆幸的是,它(如 C)使用 加宽原始转换 来完成大多数人可能期望的操作:bit.ly/d8Yx3N
            • @GregS:特鲁达特!也给你 +1 :)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-10-27
            • 2011-09-03
            • 1970-01-01
            • 2011-07-12
            • 2011-08-20
            • 1970-01-01
            相关资源
            最近更新 更多