舍入Java中的负数

根据维基百科在舍入负数时,您可以舍入绝对数。 因此,通过这种推理,-3.5将四舍五入为-4。 但是当我使用java.lang.Math.round(-3.5)返回-3时。 有人可以解释一下吗?

根据javadoc

返回与参数最接近的long。 结果通过添加1/2舍入为整数,取结果的最低值,并将结果转换为long类型。 换句话说,结果等于表达式的值:

(long)Math.floor(a + 0.5d)

从概念上讲,你会围捕。 换句话说,对于大于该值的下一个整数,-3大于-3.5,而-4小于-3。

有四种舍入方法; 你正在看的那个称为对称算术舍入(正如它所述)。 您所指的部分指出:“这种方法通常用于数学应用,例如会计。它通常在小学数学课程中教授。” 这似乎承认,这不是全球商定的规则,而是最常见的规则。

就个人而言,我不记得在学校里曾经被教过这种规则。 我对舍入的理解一直是.5被四舍五入,无论数字的符号如何。 显然,Java的作者有相同的理解。 这是非对称算术舍入。

不同的工具和语言可能使用不同的舍入方案。 Excel显然使用对称方法。

(总的来说,我建议如果你发现维基百科与经验之间存在冲突,你可以在别处寻找信息。维基百科并不完美。)

对于它的价值, java.math.BigDecimal有可选择的舍入模式,如果你需要更多的控制那种东西。

你引用的维基百科文章并没有说这是唯一的回合方式,只是常见的回合方式。 在那篇文章中还提到了几个替代方案(遗憾的是,它们都没有描述Java的舍入方法 – 即使它们在指示JavaScript的作用时将其称为“非对称算术舍入”)。

您需要决定如何舍入数字,然后使用该方法。 如果Java的实现与那个匹配,那就太好了。 否则你需要自己实现它。

根据Javadocs的说法:

返回与参数最接近的long 。 结果通过添加1/2舍入为整数,取结果的最低值,并将结果转换为long类型。 换句话说,结果等于表达式的值:

  (长)Math.floor(a + 0.5d) 

原来这个惯例是围捕。 我猜维基百科是错误的。 事实certificate,微软错了,因为他们把它四舍五入到了-4,这不符合惯例(我和那些拥有数学博士学位的人一起检查过)。