Java往返字符串怎么样 - >浮动 - >字符串甚至(某些)值不能表示为浮点数?

时间:2016-06-24 12:38:02

标签: java math floating-point numbers type-conversion

正如许多地方(例如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

Test on IDeone.com

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

Javadocs of Float.toString()试图解释一下:

  

m或a的小数部分必须打印多少位数?   必须至少有一个数字来表示小数部分,并且   超出那个数量,但只需要更多,更多的数字   唯一地将参数值与相邻的类型值区分开来   浮。

不幸的是,这让我更加困惑。为什么"根据需要打印多个数字以唯一地区分参数值"允许Java打印" 0.2"?

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

2 个答案:

答案 0 :(得分:2)

输出的舍入不是因为某些打印算法。这是因为float的大小。如果你这样做:

String fs = "0.2";
double f = Float.parseFloat(fs);
System.out.println(f);

你得到:

  

0.20000000298023224

Test on Ideone.com

这清楚地表明字符串“0.2”被解析为0.20000000298023224,但浮点数据类型无法保持它,并将其四舍五入为0.2。 double数据类型能够保存此数据,因此,当您将其解析为float ,但将其存储为double 时,您将获得预期的输出

答案 1 :(得分:1)

我猜0.2属于“Value Set Conversion”。