为什么从浮点型转换为双精度会更改值?

我一直试图找出原因,但我不能。任何人都可以帮助我吗?

请看以下示例。

float f = 125.32f;
System.out.println("value of f = " + f);
double d = (double) 125.32f; 
System.out.println("value of d = " + d);

这是输出:

value of f = 125.32
value of d = 125.31999969482422

答案 1

转换为 时,的值不会更改。显示的数字存在差异,因为需要更多的数字来区分值与其相邻值,这是 Java 文档所要求的。这是 的文档,从 的文档中引用(通过几个链接)。floatdoubledoubletoStringprintln

的确切值为 125.31999969482421875。两个相邻的值为 125.3199920654296875 和 125.32000732421875。观察 125.32 更接近 125.31999969482421875,而不是任何一个邻居。因此,通过显示“125.32”,Java已经显示足够的数字,以便从十进制数字转换回来重现传递给的值。125.32ffloatfloatfloatprintln

125.31999969482421875 的两个相邻值为 125.3199996948242045391452847979962825775146484375 和 125.3199996948242329608547152020037174224853515625
观察到 125.32 比原始值 (125.31999969482421875) 更接近后一个邻居。因此,打印“125.32”不包含足够的数字来区分原始值。Java 必须打印更多数字,以确保从显示的数字转换回重现传递给 的值。doubledoubledoubleprintln


答案 2
  1. 将 a 转换为 时,不会丢失任何信息。每个都可以精确地表示为 .floatdoublefloatdouble
  2. 另一方面,打印的十进制表示形式都不是数字的确切值。精确的十进制表示形式最多可能需要大约 760 个十进制数字。相反,将精确打印允许将十进制表示形式解析回原始或 的十进制位数。还有更多的s,因此在打印一个时,需要打印更多的数字,然后表示变得明确。System.out.printlnSystem.out.printlnfloatdoubledoubleSystem.out.println