【问题标题】:Rounding negative numbers in Java在 Java 中舍入负数
【发布时间】:2008-11-06 18:18:32
【问题描述】:

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

【问题讨论】:

标签: java rounding


【解决方案1】:

根据javadoc

返回最接近于 争论。结果四舍五入为 整数加 1/2,取 结果的地板,并铸造 结果输入长。换句话说, 结果等于 表达式:

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

从概念上讲,你是 向上。也就是说,到下一个整数大于的值且-3大于-3.5,而-4小于。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      对于它的价值,@987654321@ 具有可选的舍入模式,如果您需要对这类事情进行更多控制。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 现在我根据当前的惯例去更正了这篇文章,这就是 Java 所做的。
        • 这改变了维基百科对“常用”舍入方法的描述(它仍然可能准确也可能不准确——仅仅因为 Java 这样做并不意味着它是人们通常做的),但是这并没有改变这样一个事实,即作为一名程序员,您需要知道自己需要哪种行为。
        • 拥有数学博士学位的人的现行惯例。
        • 博士可能想要一种四舍五入,会计师可能想要另一种(“银行家的四舍五入”?),而工程师可能想要另一种(向零截断?)。至于什么是“常见”,我认为大多数时候人们在四舍五入时不会考虑负数,所以它们如何四舍五入并不重要。
        【解决方案5】:

        根据 Javadocs:

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 没有单一的“正确”方法来四舍五入。针对不同的用途有很多不同的方法。向上舍入、向下舍入、向最接近的奇数(或偶数)整数舍入等...
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多