关于浮点:java中的除法不正确

Division is incorect in java

本问题已经有最佳答案,请猛点这里访问。

我很困惑。我想得到一个int值:

1
Integer ord = new Double(33 / (-2 * 1.1)).intValue();

期望值:-15输出:-14

发生了什么?

当我尝试时:

1
Double d = 33 / (-2 * 1.1);

输出:-14.999999999999998

有什么想法吗?事先谢谢!


.intValue()将转动框架部分,以便使用Math.ceil()Math.floor()或使用Math.round()将其近似为最接近的值。

1
2
3
Integer result = (int) Math.round(new Double(33/(-2*1.1))); //-15
Integer result = (int) Math.floor(new Double(33/(-2*1.1))); //-15
Integer result = (int) Math.ceil(new Double(33/(-2*1.1)));  //-14

你可以看到,Math.ceil()给了我们14,因为这是一个负数-14>-15,所以-14.9999的CEIL是-14,而Math.floor()上的反向应用


当获得一个加倍的int值时,Java不会为你做任何循环。它只是省略了小数。

您要做的是使用math.round(double)获得您期望的值。

我相信Madio.Road()的Java doc表示它将返回一个长的值,但是如果你确信你的结果永远不会大于最大int值,那么你可以把它转换成int值。

1
 int result = (int) Math.round(new Double(33/(-2*1.1)));


双输出-14.99999999998的精度来源于双输出类型。浮点数始终是2^n数字的和。结果是,不是所有的数字都能精确地表示,即使是用双精度。

整数示例返回-14,因为-14.9999999998的整数值是-14。获取整数值时没有舍入。它只是小数点后的一部分。

对于舍入,要么使用Math.ceil()进行舍入,要么使用Math.floor()进行舍入,要么使用Math.round()进行一般舍入。


intValue()不做取整,而是截断。


您使用的是32位浮点,因此会损失很多精度。试用Double d = 33 / (-2 * 1.1d);而且,正如大家所说,圆的比截的好。


警告:使用authority参数:p

Josh Bloch有一个完整的项目,在他的有效Java书反对使用EDOCX1 10或EDCX1 11)当瞄准精度。例如,在我的生活中,与货币合作,我与BigDecimal合作取得了最好的效果。