舍入java Float.parseFloat

时间:2010-08-09 14:11:54

标签: java

鉴于以下代码,我希望它返回“float = 32000.0001”。但相反,它返回“float = 32000.0”。

System.out.println("float = "+Float.parseFloat("32000.0001"));

我能做些什么来阻止/控制四舍五入?我想要返回的全部值没有舍入。

6 个答案:

答案 0 :(得分:8)

float只有24位精度,不足以保存值中的位数。舍入不是由于解析而是由于数字的大小。如果需要浮点,则必须使用double;如果需要任意精度,则必须使用BigDecimal。

答案 1 :(得分:2)

在编写软件时使用浮点时需要非常小心 某些十进制数字没有准确的基数2表示是要记住的一件事。 一些例子是0.1,0.01,0.001。因此,要在基数2中表示这些数字,需要进行舍入。

另一个问题是,您正在处理一组有限的位来表示数字,并且可能会遇到其他舍入错误。你越远离0越远,无法准确表示的数字越多,因此进行舍入。

还有其他一些问题。大多数都在下面的论文中提到。 有关正式论文,请参阅:http://www.scribd.com/doc/5836/What-Every-Computer-Scientist-Should-Know-About-FloatingPoint-Arithmetic

不要在需要知道确切号码的地方使用花车。

答案 2 :(得分:1)

如果您感兴趣的是小数位,我会强烈建议使用BigDecimal

实际上,我不完全清楚(不检查)问题是从字符串中解析 还是将格式化转回字符串。

编辑:在这种情况下,我强烈怀疑它正在解析...考虑到float只有7个(保证)有效数字并且你试图保留9。

答案 3 :(得分:1)

正如其他人所说,float的精确度不足以保持完整的结果。 BigDecimal(double)构造函数是精确的,因此它是查看表示的便捷方式:

System.out.println(new BigDecimal(32000.0001f)); // as float
System.out.println(new BigDecimal(32000.0001d)); // as double

显示了这个:

32000
32000.00010000000111176632344722747802734375

答案 4 :(得分:0)

如果您想避免四舍五入,请使用BigDecimal。原始类型floatdouble更快,但它们不能代表许多常见的十进制值。

答案 5 :(得分:0)

浮球和双打是有限的。它们只能准确地将数字的小数部分表示为基数两个分数的总和。小数部分可以完全表示为某些系列的总和,如:

1/2 + 0/4 + 1/8 + 1/16 + ...

不幸的是,有大量常用数字永远无法完全表示,例如:

1 / 3,1 / 7,1 / 9,5 / 11等。

在您担心四舍五入之前,您必须考虑是否可以准确地表示数字。如果这种类型的准确性非常重要,那么您需要寻找非Float或非Double解决方案。

有二进制十进制库可以准确地执行这样的计算。它们的计算速度往往较慢,因为没有专门的硬件来加速计算。此外,它们往往会占用更多内存,因为您实际上存储的是数字列表。

在您可以根据需要表示您想要的详细信息后,圆形解决方案很简单。可能你甚至不需要一个舍入解决方案;因为,在这种情况下你试图舍入的主要原因是浮动无法正确表示你的价值。