正如许多地方(例如Why can't decimal numbers be represented exactly in binary?)所解释的那样,并非所有小数部分都可以表示为浮点值(例如存储在Java中的float
中)。
给出的典型例子是" 0.2"。根据这个漂亮的IEEE 754 Converter,最接近0.2的float
约为0.20000000298023224,因此解析" 0.2"因为float
应该产生这个结果。
但是,我注意到Java似乎能够做到不可能:
String number="0.2";
float f = Float.parseFloat(number);
System.out.println("Result of roundtrip String -> float -> String: "+f);
打印:
往返字符串的结果 - >浮动 - >字符串:0.2
Java如何知道我想要(圆形)输出" 0.2"而不是精确输出" 0.20000000298023224"如上所述?
Javadocs of Float.toString()
试图解释一下:
m或a的小数部分必须打印多少位数? 必须至少有一个数字来表示小数部分,并且 超出那个数量,但只需要更多,更多的数字 唯一地将参数值与相邻的类型值区分开来 浮。
不幸的是,这让我更加困惑。为什么"根据需要打印多个数字以唯一地区分参数值"允许Java打印" 0.2"?
理想情况下,答案还可以解释为什么选择此打印算法。这个例子是(一些)往返工作吗?还有其他动机吗?
答案 0 :(得分:2)
输出的舍入不是因为某些打印算法。这是因为float
的大小。如果你这样做:
String fs = "0.2";
double f = Float.parseFloat(fs);
System.out.println(f);
你得到:
0.20000000298023224
这清楚地表明字符串“0.2”被解析为0.20000000298023224,但浮点数据类型无法保持它,并将其四舍五入为0.2。 double
数据类型能够保存此数据,因此,当您将其解析为float ,但将其存储为double 时,您将获得预期的输出
答案 1 :(得分:1)
我猜0.2属于“Value Set Conversion”。