Division is incorect in java
我很困惑。我想得到一个int值:
期望值:-15输出:-14
发生了什么?
当我尝试时:
号
输出:-14.999999999999998。
有什么想法吗?事先谢谢!
- 它足够近了。欢迎使用浮点运算。如果要舍入,请使用Math.Round()而不是.IntValue()。
- 如果每次听到这个我都能得到一分钱,我大概能得到45美分。
- 整数ord=math.round(新浮点(33/(-2*1.1));
- 这个问题经常被问到。请花点时间,下次再搜索。
- 对不起,我刚接触StackOverflow。下次搜索会更好。
- 不要使用Double或Integer,除非你必须这样做。Double和int不仅简单,而且速度快得多。
- @如果每次听到这个我都有一个镍币,我可以得到44.99987美分。
.intValue()将转动框架部分,以便使用Math.ceil()、Math.floor()或使用Math.round()将其近似为最接近的值。
你可以看到,Math.ceil()给了我们14,因为这是一个负数-14>-15,所以-14.9999的CEIL是-14,而Math.floor()上的反向应用
- 这取决于Zanas_x3想要什么,但我认为Math.round()可能比Math.ceil()更符合他的期望。
- 谢谢!因为我期望这样的结果:integer-ord=new double(32/(-2*1.1)).intvalue();/-14 integer-ord=new double(33/(-2*1.1)).intvalue();/-15 integer-ord=new double(34/(-2*1.1)).intvalue();/-15 integer-ord=new double(34/(-2*1.1)).intvalue();/-15
当获得一个加倍的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合作取得了最好的效果。