Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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 增加双精度值的最后一位_Java - Fatal编程技术网

Java 增加双精度值的最后一位

Java 增加双精度值的最后一位,java,Java,我有一个双变量,像80.1466668,然后我用floor函数把它截断成8位,像80.1466666。现在我想增加这个值,得到的答案是80.1466667您可能不知道双精度的真正本质。它们没有“数字”;它们是有理数的紧凑二进制编码。因此,您将发现很难通过编程确定双精度的“最后一位”是什么 如果您的具体需要只是四舍五入,则使用四舍五入功能,而不是截断;否则考虑使用 BigDecimal < /代码>,它确实表示一个带有十进制数字的数字。 一个快速的方法是: double myNumber = 80

我有一个双变量,像80.1466668,然后我用floor函数把它截断成8位,像80.1466666。现在我想增加这个值,得到的答案是80.1466667

您可能不知道双精度的真正本质。它们没有“数字”;它们是有理数的紧凑二进制编码。因此,您将发现很难通过编程确定双精度
的“最后一位”是什么


如果您的具体需要只是四舍五入,则使用
四舍五入
功能,而不是
截断
;否则考虑使用<代码> BigDecimal < /代码>,它确实表示一个带有十进制数字的数字。

一个快速的方法是:

double myNumber = 80.14666666;
myNumber += (1 / 10^8); // = 80.14666667

这就是你想要的吗?

双精度实际上并不包含你想象中的确切值。这是因为基础字段作为二进制数保存,由于因子为1/5,因此不能包含十分之一

相反,您可以使用新的BigDecimal(“80.1466666”)并通过新的BigDecimal(“0.00000001”)增加该值


请注意,我正在传递一个字符串来初始化此对象。如果你传递了一个double,BigDecimal将根据double的值进行初始化,如前所述,double不包含你想象的确切值。

只需在数字上加上0.00000001即可

但是,浮点值不太适合这样计算。每次递增它时,都会添加一个差异,因为这样的数字只在浮点数中近似表示


如果要递增数字,请改用整数。将该数字乘以100000000并将其转换为整数,得到801466666。现在可以将整数增加1,而不会引入任何错误。保留递增的整数,并根据需要将其除以100000000转换为浮点格式。当然,浮点值在精度上仍有限制,但每一个浮点值都是从对应的整数转换而来的结果,而整数值没有任何精度问题,因此每次递增时都不会累积错误。

为什么不直接取整?为什么不问问题?:)我建议“添加0.00000001”,但我担心会有反对票……”“现在我想增加这个值,得到的答案是80.1466667。”我们允许您继续。如果最后一个数字是9怎么办?