【发布时间】:2014-06-16 20:41:26
【问题描述】:
这是我正在查看的内容:
float p=1.15f;
BigDecimal bdp=new BigDecimal(p);
float q=1.1499999f;
float r=1.14999999f;
System.out.println(p); //1.15
System.out.println(bdp); //1.14999997615814208984375
System.out.println(q); //1.1499999
System.out.println(r); //1.15
所以我知道“p”1.15 的十进制值不能用二进制精确表示。
所以大的小数“bdp”输出对我来说非常有意义......这是浮点数的实际值。
问题 1
当浮点“p”转换回输出字符串(如 1.15)时,该舍入如何/在哪里发生(从内部 1.149..375 值到 1.15)?
它在文档中的哪里指定? toString javadoc 并没有真正的帮助(至少我是这样)。
我确实在the language spec看到了这个:
float 和 double 类型的元素是那些可以 使用 IEEE 754 32 位单精度和 64 位表示 分别为双精度二进制浮点格式。
Wikipedia's IEEE 754 article 给出了这个:
这给出了 6 到 9 位有效十进制数字的精度(如果 最多 6 位有效小数的十进制字符串转换为 IEEE 754个单精度再转换回相同的个数 有效小数,则最终字符串应与原始字符串匹配;
问题 2
所以看起来这就是 Java/IEEE 754 浮点数应该如何工作的?
我可以保证浮点/字符串转换/表示的准确性达到一定位数(如“p”和“q”),如果超过该位数,Java 将进行一些舍入以进行显示(如对于“r”)?
感谢您的帮助。
【问题讨论】:
-
除非你从事科学工作!停止使用浮点数。
-
正确。我们在代码中使用 BigDecimals。但是我们从另一个系统得到双打,我需要了解这些细节,这样我才能确保我正在处理尽可能准确的数据。谢谢
-
如果您对此类问题感兴趣,请考虑使用
System.out.println(new BigDecimal(someFloat));获取someFloat的精确十进制表示。
标签: java floating-point