将double值显式转换为float并将其存储在double变量中

时间:2018-06-03 06:50:31

标签: java casting

如果我创建一个double变量并为其指定一个表达式(例如5d / 3d)并明确转换为float,比如,

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

输出:

1.6666666269302368

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

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

2 个答案:

答案 0 :(得分:0)

这是因为当你将5和3分开时,位模式的排列方式,它是一个不精确的浮点值(它是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

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

答案 1 :(得分:0)

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

但是,由于演员表,这些小数位是不准确的。 System.out.println实际上已经发明了它们。尝试删除演员表,查看您获得的内容,或将结果打印为float。做任何一个都应该给出更明智的结果。