【发布时间】:2008-11-06 18:18:32
【问题描述】:
根据Wikipedia 舍入一个负数时,你舍入绝对数。因此,根据这种推理,-3.5 将四舍五入为 -4。但是当我使用 java.lang.Math.round(-3.5) 返回-3。有人可以解释一下吗?
【问题讨论】:
-
各种舍入方法的简洁描述:mathforum.org/library/drmath/view/71202.html
根据Wikipedia 舍入一个负数时,你舍入绝对数。因此,根据这种推理,-3.5 将四舍五入为 -4。但是当我使用 java.lang.Math.round(-3.5) 返回-3。有人可以解释一下吗?
【问题讨论】:
根据javadoc
返回最接近于 争论。结果四舍五入为 整数加 1/2,取 结果的地板,并铸造 结果输入长。换句话说, 结果等于 表达式:
(long)Math.floor(a + 0.5d)
从概念上讲,你是 向上。也就是说,到下一个整数大于的值且-3大于-3.5,而-4小于。
【讨论】:
有多种取整方法;您正在查看的那个称为对称算术舍入(如其所述)。您所指的部分指出:“这种方法通常用于数学应用中,例如会计。它是小学数学课上普遍教授的方法。”这似乎承认这不是全球公认的规则,只是最常见的规则。
就我个人而言,我不记得曾经在学校教过这条规则。我对四舍五入的理解一直是 0.5 向上舍入,无论数字的符号如何。显然,Java 的作者也有同样的理解。这是非对称算术舍入。
不同的工具和语言可能使用不同的舍入方案。 Excel 显然使用了对称方法。
(总的来说,我建议如果你发现维基百科和经验之间存在冲突,你可以在别处寻找信息。维基百科并不完美。)
【讨论】:
对于它的价值,@987654321@ 具有可选的舍入模式,如果您需要对这类事情进行更多控制。
【讨论】:
您引用的维基百科文章并没有说这是唯一的舍入方法,只是常见的舍入方法。在那篇文章中还提到了几个替代方案(不幸的是,这些替代方案都没有描述 Java 的舍入方法 - 即使他们在指出 JavaScript 所做的事情时将其称为“非对称算术舍入”)。
您需要决定如何希望将数字四舍五入,然后使用该方法。如果 Java 的实现与此匹配,那就太好了。否则你需要自己实现它。
【讨论】:
根据 Javadocs:
返回最接近参数的long。通过加 1/2、取结果的底并将结果转换为类型 long,将结果四舍五入为整数。换句话说,结果等于表达式的值:
(long)Math.floor(a + 0.5d)
【讨论】:
原来约定是四舍五入。我猜维基百科是错误的。然而,事实证明微软弄错了,因为他们也将它四舍五入为 -4,这不符合惯例(我与拥有数学博士学位的人核实过)。
【讨论】: