【问题标题】:Converting a double value into float explicitly and storing that in a double variable将双精度值显式转换为浮点数并将其存储在双精度变量中
【发布时间】:2018-11-12 19:24:35
【问题描述】:

如果我创建一个双变量并为其分配一个表达式,例如 (5d / 3d) 并显式转换为浮点数,例如,

 double c = (float)(5d / 3d);
 System.out.println(c);

输出:

1.6666666269302368

它应该给出浮点数据类型的精度,因为浮点小于双精度,所以双变量在存储浮点值时应该没有问题,但输出是荒谬的。为什么会这样?

请帮助我理解这段代码的输出。我无法理解代码中的这个输出。

【问题讨论】:

  • 为什么输出很荒谬?你期待什么?
  • 我预计输出应该是小数点后 7 位,即 1.6666666,这是浮点数据类型的精度。由于 float 小于 double 因此 double 变量存储最多 7 位的十进制数应该没有问题。这是我的想法,但似乎想法是错误的。

标签: java casting


【解决方案1】:

这是因为当你除以五和三时位模式的排列方式,它是一个不精确的浮点值(它是1.6666666 和一点点)。就那么简单。为了演示,

float f = (float) (5.0 / 3);
System.out.printf("%f=%s %s=%s%n", f, Float.toHexString(f), 
        (double) f, Double.toHexString(f));
System.out.printf("%s=%s %s=%s%n", f, Float.toHexString(f), 
        (double) f, Double.toHexString(f));

输出是

1.666667=0x1.aaaaaap0 1.6666666269302368=0x1.aaaaaap0
1.6666666=0x1.aaaaaap0 1.6666666269302368=0x1.aaaaaap0

在这两种情况下,您都会注意到位模式是恒定的。

【讨论】:

    【解决方案2】:

    我的 Java 技能非常生疏,但我认为这里发生的情况是,当您将除法结果转换为 float 时,您丢掉了一半的精度。然后,当您将其存储在 double 中并将其传递给 System.out.println 时,System.out.println 尝试将其打印到数十亿个小数位。

    但是,由于演员阵容,这些小数位不准确。 System.out.println 实际上发明了它们。尝试移除演员表,看看你得到了什么,或者将结果打印为float。做任何一个应该会产生更明智的结果。

    【讨论】:

      猜你喜欢
      • 2015-06-12
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      相关资源
      最近更新 更多