在java中分区不正确

时间:2014-01-09 08:07:12

标签: java floating-point division

我很困惑。我正在尝试获得int值:

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

期望:-15
输出:-14

怎么了?

当我尝试:

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

输出:-14.999999999999998

有什么想法吗?提前谢谢!

6 个答案:

答案 0 :(得分:6)

.intValue()将截断frarctinal部分,以便您可以使用Math.ceil()Math.floor(),或者您可以使用Math.round()将其近似为最接近的值

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()

答案 1 :(得分:1)

intValue()不会进行舍入而是截断。

答案 2 :(得分:1)

-14.999999999999998的双输出具有双精度的精度。浮点数始终是2^n个数的总和。结果是,即使使用double,也不能精确表示所有数字。

您的整数示例返回-14,因为整数值-14.999999999999998是-14。获取整数值时没有舍入。它只是在小数点切割。

对于四舍五入,使用Math.ceil()进行四舍五入,Math.floor()进行四舍五入,或Math.round()进行一般舍入。

答案 3 :(得分:1)

获取double的int值时,java不会为您进行任何舍入或向下舍入。它只是省略了小数。

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

我相信Math.round()的java doc说它会返回一个long值,但是如果你确定你的结果永远不会大于最大int值,那么你可以将它转换为int。

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

答案 4 :(得分:0)

警告:使用权限参数:P

Josh Bloch在他的“有效Java”一书中有一个完整项目,反对在准确性时使用doublefloat。例如,在我的生活中,使用货币,我使用BigDecimal

获得了最好的结果

答案 5 :(得分:0)

你正在使用32位浮点数,因此失去了很多精度。试试Double d = 33 / (-2 * 1.1d); 并且,正如每个人所说,比截断更好。