【问题标题】:Java float to long explicit cast [duplicate]Java浮点到长显式转换[重复]
【发布时间】:2016-02-20 03:30:44
【问题描述】:

我想了解这段代码中的 i 是如何最终变成 99999904 的?

long i = (long)(99999900f);
System.out.println(i);

我知道浮点数是用小数存储的,并不是它们看起来的确切值,但我不明白这会如何导致第一个数字是 4 而不是 9 或最终会四舍五入的东西99999900?

【问题讨论】:

  • 试试System.out.println(99999900f);
  • 9.9999904E7 最短的评论曾经如此清楚地解释过!所有浮点数都以这种格式存储吗?即小数点前有1位数字?谢谢
  • 没关系,刚刚测试了一对,似乎随着数字的增长,我们在小数中存储了更多的数字,可能是为了我们可以容纳比浮点数更大的数字。再次感谢
  • 浮点数有two parts。另请参阅Welcome to the Secret Robot Internet

标签: java casting floating-point type-conversion floating-accuracy


【解决方案1】:

我想了解这段代码中的 i 如何最终变成 99999904

99999904 在二进制中的表示比 99999900 更简单(使用较少的有效数字),并且由于后者需要比浮点数更多的有效数字,因此 Java 必须使用最接近的可表示值。

99999900 十六进制:0x5F5E09C 24 位有效二进制数字在十六进制中的样子: 0x7FFFFF8 99999904 十六进制:0x5F5E0A0

在两个最接近的可表示值 0x5F5E098 和 0x5F5E0A0 之间,Java 根据“nearest-even” 规则选择了后者。这两个可表示的值实际上同样接近,但 0x5F5E0A0 的最后一位有效数字为 0,因此根据此规则选择。您可以自行检查 99999899 向下舍入为 0x5F5E098,99999900 向上舍入为 0x5F5E0A0。

float 类型有 24 位有效二进制数字,可以精确表示 0 到 224-1 之间的所有整数。 224 恰好也可以精确表示(它只有一个有效数字),但 224+1 或 16777217 不能精确表示为 float,并且它上面的整数也不会自动精确地表示为float

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    相关资源
    最近更新 更多