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
Java如何知道我想要(舍入)输出"0.2",而不是如上所述的精确输出"0.20000000298023224"?
该的Javadoc中Float.toString()试图解释这一点:
m或a的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,并且除此之外必须有多个,但只有多少个,更多的数字才能唯一地将参数值与float类型的相邻值区分开来.
不幸的是,这让我更加困惑.为什么"打印尽可能多的数字来唯一区分参数值"允许Java打印"0.2"?
理想情况下,答案也可以解释为什么选择此打印算法.这个例子是(一些)往返工作吗?还有其他动机吗?