【问题标题】:Non Decimal Numbers on Math.ceil or Math.round in JavaScript?JavaScript 中 Math.ceil 或 Math.round 上的非十进制数?
【发布时间】:2013-05-16 13:13:30
【问题描述】:

我想使用 Javascript 对数字进行四舍五入。 比如这样,

15 => 20
345 => 400
201 => 300
180 => 200
93 => 100
22 => 30

如何使用 Javascript 实现这一点?我知道我可以使用 Math.ceil 或 Math.round 但这不是十进制数。

【问题讨论】:

  • 我建议您恢复您的编辑,因为您已经对原始问题得到了很好的答案。
  • 我认为您编辑问题的方式使以前正确的答案现在变得不正确是很不礼貌的。
  • 我很抱歉..我只是再次重新编辑我的问题...

标签: javascript math numbers rounding


【解决方案1】:

要四舍五入到最接近的 100 的倍数,可以这样写

100*Math.ceil(x/100)

其他因素也是如此。

选择一个“好”的因素可能是一个不同的问题。你可以取你的数字的以 10 为底的对数,乘以三并四舍五入。然后您可以应用以下地图:

3*round(log10(x))  factor
               0    1
               1    2
               2    5
               3   10
               4   20
               5   50

您不必存储该表:使用模运算,您可以计算因子的前导数字,并使用第三部分的下限,您可以获得尾随零的数量。

这是否合适取决于您的应用程序。您问题中的代码似乎只使用了 10 的幂。在这种情况下,不要在上述方法中乘以 3,而只需直接使用以 10 为底的对数的底数:

factor = Math.pow(10, Math.floor(Math.log(x)/Math.log(10)));
rounded = Math.ceil(x/factor)*factor;

【讨论】:

  • 一个好的程序员是理解模糊规范的能力。 ;)
  • 适用于原始问题的示例输入:ideone.com/Meb868。但是,问题已被编辑,因此答案不再适用。
【解决方案2】:

第一个示例的解决方案:

var n = 15;
n /= 10; //n = 1.5
n = Math.ceil(n); //n = 2
n *= 10; //n = 20

其他示例的工作方式相同。

【讨论】:

    【解决方案3】:

    你想要的答案取决于精度。

    一个基本的解决方案是

    function round(num, precision) { 
      var div = Math.pow(10, precision); 
      return Math.ceil(num/div)*div;
    }
    

    【讨论】:

      【解决方案4】:

      如何将数字除以 10/100/1000 得到小数,然后是 ceil/round。然后再相乘。

      这是我想到的第一个解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 2020-05-19
        • 2016-01-05
        • 1970-01-01
        • 2011-07-15
        相关资源
        最近更新 更多