微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

参见英文答案 > how does Java convert floats to strings                                    3个
正如许多地方(例如Why can’t decimal numbers be represented exactly in binary?)所解释的那样,并非所有小数部分都可以表示为浮点值(例如存储在Java中的浮点数中).

给出的典型示例是“0.2”.根据这个漂亮的IEEE 754 Converter,最接近0.2的浮点数约为0.20000000298023224,因此解析“0.2”作为浮点数应该产生这个结果.

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

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

打印:

Result of roundtrip String -> float -> String: 0.2

Test on IDeone.com

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

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

How many digits must be printed for the fractional part of m or a?
There must be at least one digit to represent the fractional part,and
beyond that as many,but only as many,more digits as are needed to
uniquely distinguish the argument value from adjacent values of type
float.

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

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

最佳答案
输出的舍入不是因为某些打印算法.这是因为浮动的大小.如果你这样做:

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时,您将获得预期的输出.

原文地址:https://www.jb51.cc/java/437314.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐