int
值:
Integer ord = new Double(33 / (-2 * 1.1)).intValue();
期望:-15
输出:-14
怎么了?
当我尝试:
Double d = 33 / (-2 * 1.1);
输出:-14.999999999999998
有什么想法吗?提前谢谢!
答案 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”一书中有一个完整项目,反对在准确性时使用double
或float
。例如,在我的生活中,使用货币,我使用BigDecimal
答案 5 :(得分:0)
你正在使用32位浮点数,因此失去了很多精度。试试Double d = 33 / (-2 * 1.1d)
;
并且,正如每个人所说,比截断更好。