【问题标题】:JavaScript: Rounding Down in .5 CasesJavaScript:在 .5 种情况下四舍五入
【发布时间】:2016-03-06 00:58:23
【问题描述】:

我处于 JavaScript 函数生成数字的情况,例如 2.5。我想让这五个数字向下舍入到2,而不是Math.round 的结果,在这种情况下总是会四舍五入(忽略奇偶规则),产生2。有没有更优雅的方式这样做比在舍入前从数字中减去 0.01 吗?谢谢。

【问题讨论】:

  • 如果你在做“银行”数学,那么使用任何二进制浮点系统都是一个根本性错误。
  • 如果您想对银行家进行四舍五入,这可能会有所帮助:stackoverflow.com/questions/3108986/…

标签: javascript decimal rounding


【解决方案1】:

只需对Math.round的输入和输出取反即可:

var result = -Math.round(-num);

更详细地说:JavaScript 的Math.round 具有不寻常的属性,它会将中途情况舍入到正无穷大,无论它们是正数还是负数。例如2.5 将舍入为3.0,但-2.5 将舍入为-2.0。这是一种不常见的舍入模式:更常见的是从零(所以-2.5 将舍入为-3.0)或最接近的偶数舍入中途的情况。

但是,它确实有一个很好的特性,那就是让它适应向负无穷大的中途情况是微不足道的:如果这是你想要的,那么你所要做的就是否定输入和输出:

例子:

function RoundHalfDown(num) {
  return -Math.round(-num);
}

document.write("1.5 rounds to ", RoundHalfDown(1.5), "<br>");
document.write("2.5 rounds to ", RoundHalfDown(2.5), "<br>");
document.write("2.4 rounds to ", RoundHalfDown(2.4), "<br>");
document.write("2.6 rounds to ", RoundHalfDown(2.6), "<br>");
document.write("-2.5 rounds to ", RoundHalfDown(-2.5), "<br>");

【讨论】:

  • 我认为这个解决方案不再有效。其他人也可以检查吗?
  • “运行代码 sn-p”按钮仍然会产生我期望的结果(Safari、macOS)。你能详细说明哪一部分不适合你吗?
【解决方案2】:

这样做:

var result = (num - Math.Floor(num)) > 0.5 ? Math.Round(num):Math.Floor(num);

【讨论】:

  • 这不是 OP 想要的。他们需要一个函数来根据值自动确定是向上还是向下舍入。
【解决方案3】:

存在另一种方法是使用实​​数(而不是 0.2 使用 20,0.02 使用 2 等),然后添加将结果除以的 floatingPoints 变量(在您的情况下为 2)。因此,您可以作为 Number/(10^floatingPoints) 操作。 该解决方案广泛应用于外汇公司。

【讨论】:

  • 在进行除法运算时仍有(很好的)出错机会。
【解决方案4】:

您也可以使用此函数进行不带小数部分和 0.5 向下规则(仅正数)的舍入:

function customRound(number) {
   var decimalPart = number % 1;
   if (decimalPart === 0.5)
      return number - decimalPart;
   else
      return Math.round(number);
}

对不起我的英语。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多