Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java Float.parseFloat中的舍入_Java - Fatal编程技术网

java Float.parseFloat中的舍入

java Float.parseFloat中的舍入,java,Java,给定以下代码,我希望它返回“float=32000.0001”。但是,它返回“float=32000.0” 我能做些什么来防止/控制四舍五入吗?我希望返回完整值,不进行舍入。如果您对小数位数感兴趣,我强烈建议使用 事实上,我并不完全清楚(没有检查)问题是从字符串解析还是格式化回字符串 编辑:在这种情况下,我强烈怀疑这是在解析上舍入。。。假定float只有7个(保证的)有效数字,而您正试图保留9。如果要避免四舍五入,请使用BigDecimal。基本类型float和double速度更快,但它们不能表

给定以下代码,我希望它返回“float=32000.0001”。但是,它返回“float=32000.0”


我能做些什么来防止/控制四舍五入吗?我希望返回完整值,不进行舍入。

如果您对小数位数感兴趣,我强烈建议使用

事实上,我并不完全清楚(没有检查)问题是从字符串解析还是格式化回字符串


编辑:在这种情况下,我强烈怀疑这是在解析上舍入。。。假定
float
只有7个(保证的)有效数字,而您正试图保留9。

如果要避免四舍五入,请使用
BigDecimal
。基本类型
float
double
速度更快,但它们不能表示许多常见的十进制值。

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

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

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

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

1/3、1/7、1/9、5/11等

在你担心舍入之前,你必须考虑数字是否可以准确地表示出来。如果这种精度非常重要,那么您需要寻找非浮点或非双精度的解决方案

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


在您可以将您想要的数字表示为您想要的细节之后,四舍五入解决方案就很简单了。很可能你甚至不需要一个取整的解决方案;因为,在这种情况下,您尝试舍入的主要原因是浮点不能正确表示您的值。

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

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

还有其他几个问题。大多数都在下面的文章中提到。 有关正式论文,请参见:


不要在需要知道确切数字的地方使用浮点数。

正如其他人所指出的,
浮点数的精度不足以保存完整的结果。构造函数是精确的,因此它是查看表示的简便方法:

System.out.println(new BigDecimal(32000.0001f)); // as float
System.out.println(new BigDecimal(32000.0001d)); // as double
其中显示以下内容:

32000
32000.00010000000111176632344722747802734375

我将单行拆分为多行,并通过调试器运行它。问题似乎出在解析中。看起来Float.parseFloat四舍五入为“32000.0”@Shane:我怀疑,您仍然假设调试器正在向您显示确切的值。更改为BigDecimal修复了我的小数问题如果您是从文本解析它,您应该使用
BigDecimal(String)
构造函数;将给予更好的回报precision@Sanjay马诺哈:对;这只是比较相应的
float
double
值的十进制表示形式的一种方便方法。此计算器是另一种选择:
32000
32000.00010000000111176632344722747802734375