19

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

4

6 回答 6

19

根据javadoc

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

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

从概念上讲,你四舍五入也就是说,到下一个整数值大于-3 大于-3.5,而-4 小于。

于 2008-11-06T18:21:37.970 回答
8

有多种取整方法;您正在查看的那个称为对称算术舍入(如其所述)。您所指的部分指出:“这种方法通常用于数学应用中,例如会计。它是小学数学课上普遍教授的方法。” 这似乎承认这不是全球公认的规则,只是最常见的规则。

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

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

(总的来说,我建议如果您发现 Wikipedia 和经验之间存在冲突,请在其他地方寻找信息。Wikipedia 并不完美。)

于 2008-11-06T18:23:19.527 回答
6

对于它的价值,java.math.BigDecimal如果您需要对此类事情进行更多控制,则可以选择舍入模式。

于 2008-11-06T19:35:05.873 回答
4

您引用的维基百科文章并没有说这是唯一的舍入方法,只是常见的舍入方法。在那篇文章中还提到了几种替代方法(不幸的是,这些方法都没有描述 Java 的舍入方法——即使它们在指出 JavaScript 所做的事情时将其称为“非对称算术舍入”)。

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

于 2008-11-06T18:31:12.583 回答
2

根据Javadocs:

返回最接近long参数的值。通过加 1/2、取结果的底并将结果转换为 type ,将结果四舍五入为整数long。换句话说,结果等于表达式的值:

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

于 2008-11-06T18:24:27.653 回答
0

事实证明,惯例是四舍五入。我猜维基百科是错误的。然而,事实证明微软弄错了,因为他们也将其四舍五入为 -4,这不是惯例(我与拥有数学博士学位的人核实过)。

于 2008-11-06T18:29:32.433 回答