当前位置: 首页 > 知识库问答 >
问题:

如何Java往返字符串->浮点数->字符串,即使是(一些)值不能表示为浮点数?[重复]

公孙宏远
2023-03-14

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

给出的典型例子是“0.2”。根据这个漂亮的IEEE 754转换器,最接近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);

印刷品:

往返字符串的结果-

在IDeone.com上测试

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

Float的Javadocs。toString()尝试解释这一点:

m或a的小数部分必须打印多少位数?必须至少有一位数字来表示小数部分,除此之外,还要有尽可能多的数字来唯一区分参数值和相邻的float类型值。

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

理想情况下,答案也会解释为什么选择这种打印算法。它是为了让(一些)往返工作,就像这个例子一样?还有其他动机吗?

共有2个答案

李昱
2023-03-14

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

林烨华
2023-03-14

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

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

您将获得:

0.20000000298023224

Ideone.com测试

这清楚地表明,字符串“0.2”被解析为0.20000000298023224,但float数据类型无法保存它,并将其向上舍入为0.2。< code>double数据类型能够保存该数据,因此,当您将它解析为float,但将其存储在double中时,您会得到预期的输出。

 类似资料:
  • 问题内容: 检查字符串是否可以在Python中表示为数字的最佳方法是什么? 我目前拥有的功能是: 它不仅丑陋且缓慢,而且看起来笨拙。但是我还没有找到更好的方法,因为调用floatmain函数甚至更糟。 问题答案: 如果您要解析(正数,无符号)整数而不是浮点数,则可以将该isdigit()函数用于字符串对象。 字符串方法- isdigit():Python2,Python3

  • 我正在尝试将一个包含“4,3”这样的数字的列转换为数据类型string。 ValueError:无法将字符串转换为浮点数:“4,3”

  • 问题内容: 这是我正在查看的内容: 因此,我知道不能完全用二进制表示“ p” 1.15的十进制值。 因此,大的十进制大“ bdp”输出对我来说非常有意义……这是浮点数的实际值。 问题1 当浮点数“ p”转换回字符串以进行输出(如1.15)时,如何四舍五入(从内部1.149..375到1.15)? 在文档中的什么地方指定?toString javadoc并没有真正帮助(至少对我来说)。 我在语言规范

  • 我看到的是: 所以我知道“p”1.15的十进制值不能用二进制来精确表示。 所以大的十进制“bdp”输出对我来说非常有意义……这是浮点数的实际值。 问题 1 当浮点数“p”转换回字符串以进行输出(如 1.15)时,该舍入如何/在何处发生(从内部 1.149..375 值转换为 1.15)? 它在文档中的哪个位置指定?托斯特林爪哇并没有真正的帮助(至少我)。 我确实在语言规范中看到了这一点: 浮点和双

  • 问题内容: 正如标题所说。我不认为有可能这样做,但如果可以告诉我。 这是我正在编写的bukkit(minecraft服务器)插件所必需的。我要执行一个命令:tnt [power]。电源是我想转换为浮点数的返回字符串。 谢谢 问题答案: 用于进行转换。 和之间的区别只是回报。如果需要(对象),请使用前者;如果要数字,请使用后者。

  • 问题内容: 我有一个像 从上面的字符串中,我需要获取一个值。 当我使用替换所有功能。 当字符串有两个点时,这将不起作用。 浮点值的位置可能有所不同。 问题答案: 首先丢弃所有非float字符,然后像这样隐秘给Float: