当我在带有双精度数和其他数字数据类型的java中执行简单数学运算时,double值似乎随机地从假定结果中略有变化,可能是5,59999999997或6,0000000002或其他东西。当我转换为int时,double值显然向下舍入到下一个整数。这是否意味着双倍可能是5或6?或者“5,999999999997”仍然算作6,但这取决于二进制浮点值?如果没有,有没有办法让负面变化向上舍入,但不是从5,5到5,999999999996的较低值?
我的意思是,我真的不想按照我上一句话中描述的那样四舍五入。我想总是向下舍入到下一个整数,但我不想因为错误的双重数学结果而导致额外的减少。
答案 0 :(得分:4)
将double转换为int总是向下舍入。您可以通过Math.round(double)舍入到最接近的整数。由于floating point error,双倍与您的期望不同。
答案 1 :(得分:1)
如果要进行舍入,可以使用round()方法。
double d = 6 +/- some small error
long l = Math.round(d);
或者您可以为正数添加0.5
long l = (long) (d + 0.5);
或
long l = (long) (d + (d < 0 ? -0.5 : 0.5));
答案 2 :(得分:1)
我不确定我理解这个问题。通常当你将一个double转换为int时,你可以添加0.5来获得一个很好的回合。
答案 3 :(得分:0)
来自Java Language Specification:
将浮点值转换为a时,Java编程语言使用舍入为零 整数(第5.1.3节),在这种情况下,就像数字被截断,丢弃一样 尾数位。向零舍入选择其结果格式的值最接近 并且其数量不会超过无限精确的结果。
所以5,999999999997当转换为int将5和6,0000000002将是6.如果我理解你所要求的具有负值版本的值(例如-5.97),我看不清楚如何
Math.round()
不足以满足您的要求。 -6,0000000002将舍入到-6,将-5,999999999997和其他每个值舍入(但不包括)-5.5。