Java往返String - > float - > String甚至(某些)值不能表示为float?

sle*_*ske 5 java math floating-point numbers type-conversion

正如许多地方所解释的那样(例如为什么十进制数不能用二进制数精确表示?),并非所有小数部分都可以表示为浮点值(例如存储float在Java中).

给出的典型示例是"0.2".根据这个漂亮的IEEE 754转换器,float最接近0.2的是大约0.20000000298023224,因此解析"0.2"作为a float应该产生这个结果.

但是,我注意到Java似乎能够做到这一点:

String number="0.2";
float f = Float.parseFloat(number);
System.out.println("Result of roundtrip String -> float -> String: "+f);
Run Code Online (Sandbox Code Playgroud)

打印:

往返字符串的结果 - > float - >字符串:0.2

在IDeone.com上测试

Java如何知道我想要(舍入)输出"0.2",而不是如上所述的精确输出"0.20000000298023224"?

的Javadoc中Float.toString()试图解释这一点:

m或a的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,并且除此之外必须有多个,但只有多少个,更多的数字才能唯一地将参数值与float类型的相邻值区分开来.

不幸的是,这让我更加困惑.为什么"打印尽可能多的数字来唯一区分参数值"允许Java打印"0.2"?

理想情况下,答案也可以解释为什么选择此打印算法.这个例子是(一些)往返工作吗?还有其他动机吗?

mau*_*tto 1

我猜0.2属于“值集转换”。