Java:(int)双重可靠吗?

时间:2014-03-01 21:18:28

标签: java math double

当我在带有双精度数和其他数字数据类型的java中执行简单数学运算时,double值似乎随机地从假定结果中略有变化,可能是5,59999999997或6,0000000002或其他东西。当我转换为int时,double值显然向下舍入到下一个整数。这是否意味着双倍可能是5或6?或者“5,999999999997”仍然算作6,但这取决于二进制浮点值?如果没有,有没有办法让负面变化向上舍入,但不是从5,5到5,999999999996的较低值?

  • 我的意思是,我真的不想按照我上一句话中描述的那样四舍五入。我想总是向下舍入到下一个整数,但我不想因为错误的双重数学结果而导致额外的减少。

4 个答案:

答案 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。