【问题标题】:Rounding to the nearest hundredth of a decimal in JavaScript在 JavaScript 中四舍五入到小数点后的百分之一
【发布时间】:2013-02-04 18:59:04
【问题描述】:

我在 JavaScript 中使用变量来表示数字进行简单的数学运算。 这是我的代码示例:

var ones = 0;
var fives = 0;
function results (){
    _fives = (fives * 5);
    var res = (_fives + ones);
    document.innerHTML = res;
}

这不是完整的代码,但基本上我让用户输入从 1 美分硬币到 100 美元的钞票和硬币的数量。该代码将票据金额乘以票据价值。这没问题工作得很好...... 出于某种原因,在我的某些结果中,它显示了一个小数点,例如 1.899999999997,不确定这是怎么发生的。

有没有办法改变它,让它四舍五入到最接近的小数点的百分之一?

例如,它不会显示 1.89999999997,而只会显示 1.90 实际上这不是一个大问题。这是一件私人的事情,我可以自己解决它,但是学习如何做这将是很好的,以供将来参考。

【问题讨论】:

标签: javascript math decimal


【解决方案1】:

当您执行以下操作时,这是 JavaScript 的已知问题:

0.1 + 0.5 = 0.600000000001 or 0.599999999998

此问题的解决方案是使用具有固定精度和舍入模式的 JavasSript 库之一。你可以试试诈骗链接。这是代码示例:

// Initialization
var bn = new BigNumbers({
    precision: 20, // fixed precision 20 digits after decimal separator 
    roundingMode: BigNumbers.RoundingMode.HALF_UP // rounding mode is Half Up
});

var number1 = bn.of('15');
var number2 = bn.of('12');


var divideResult = number1.divide(number2); // result "1.25"
var multiplyResult = divideResult.multiply(1/2); // result "0.625"
var roundingToTwoDecimalResult = multiplyResult.toPrecision(2); // result "0.63"

(提供的外部链接在被诈骗者破坏或黑客攻击后被删除 - 2020 年 10 月)

【讨论】:

    【解决方案2】:

    这是我个人决定在我正在开发的一个应用程序中使用的!

    const roundToHundredth = (value) => {
      return Number(value.toFixed(2));
    };
    
    console.log(roundToHundredth(1.98723232))
    console.log(roundToHundredth(3.14159265359))
    console.log(roundToHundredth(2.67528))

    【讨论】:

    • 这会给你一个字符串,所以如果你需要处理一个数字,你可能必须把它解析回来。
    【解决方案3】:

    我实际上一直在处理这个问题,因为我一直在努力为我正在从事的向量项目实施舍入解决方案。我真的很惊讶这个较旧的(2011)javascripter.net 资源没有成功,特别是因为它使用了前面提到的Math.round( // ...

    我已经添加了一点,也使用了.toFixed()(尽管这会去掉任何尾随的零,在这个阶段我个人并不太担心):

    
    const round = (number, places) => {
       let rounder = '1';
    
       for (let i = 0; i < places; i++) {
           rounder += '0';
       }
    
       return (Math.round(number * rounder) / rounder).toFixed(places);
    };
    
    

    我确信上述在效率或冗余方面存在一些问题;但我的观点是Math.round() 仍然可以满足您的需要。在迭代之后,可能需要在上面进行转换。

    它也比其他一些建议的解决方案更容易阅读。

    【讨论】:

      【解决方案4】:

      用于大小数的四舍五入工具。可以通过为 'decimal' 分配不同的值来调整以处理不同的小数大小。

      const roundToWholeNumber = (num, decimal = 100000) => {
      
          const _roundingHelper = (val, decimalPlace) => {
      
              return Math.round(val * decimalPlace) / decimalPlace;
      
          }
      
          while(decimal > 1){
              num = _roundingHelper(num, decimal)
              decimal = decimal / 10
          }
      
          return Math.round(num)   
      }
      roundToWholeNumber(5.44444555)
      

      【讨论】:

        【解决方案5】:

        更新:MDN 实际上有一个great example of decimal rounding that avoids floating point inaccuracies。他们的方法可以根据 OP 修改为始终向上取整。


        原始(有些不正确)答案

        //to round to n decimal places
        function round(num, places) {
            var multiplier = Math.pow(10, places);
            return Math.round(num * multiplier) / multiplier;
        }
        

        编辑:我没有完整阅读这个问题。既然我们在谈论货币,我们可能想把它四舍五入:

        //to round up to two decimal places
        function money_round(num) {
            return Math.ceil(num * 100) / 100;
        }
        

        【讨论】:

        • 这是如何工作的?我应该替换任何东西还是这正是我应该在我的代码中添加的内容?
        • 啊是的...它没有四舍五入。编辑传入
        • 现在回答您的问题。 Javascript 的Math.round 方法四舍五入到最接近的整数。通过在四舍五入之前将原始数字乘以十的倍数(每个要保留的小数一个),然后除以相同的值,您可以保留所需的小数。这并不能解决浮点数的问题,但它至少可以让您打印出不错的金额。
        • 现在似乎可以工作了。我不得不稍微玩一下代码,但现在它很完美 =] 非常感谢!
        • 这仅适用于大约。它没有也不能四舍五入到精确的小数位数,因为浮点数没有小数位,它有二进制位,而且它们与小数位不可通约。
        【解决方案6】:

        我知道这可能晚了一天,而且还缺一美元,但我也在寻找类似的东西,这个问题让我研究了 Math.round 功能

        我想出了这个方法,它成功地将给定值四舍五入到最接近的第 5 位、第 100 位。所以 0.07 变成 0.05。 23.45 变为 23.45。 1006.32 变为 1006.30。

        <script>
        function rounder() {
        var exampleInput = $("#inputId").val();
        $("#output").html(((Math.round(((Math.round(exampleInput*100)/5)*5)/5)*5)/100).toFixed(2));
        }
        </script>
        

        作为一个新手,我确信有办法让这段代码更有效率。

        【讨论】:

        • 努力,但我认为你现在可以做得更好
        【解决方案7】:

        实际上,这种方法并非在所有情况下都有效。我正在做类似于将测量值四舍五入到一定位数的事情。

        在我的情况下,我有一个测量的平均值和标准偏差,例如 0.20812345967 +/- 0.0031647859。现在显然额外的有效数字是没有意义的,所以我想把它写成 0.208 +/- 0.003。当我做浮点数学时,我得到 0.20800000000000002 +/- 0.003

        通常这会正确四舍五入,但由于以十进制为底的十进制数有时不能完全存储为二进制,所以你会得到这样的废话。

        相反,我要寻找字符串格式的解决方案

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-06
          相关资源
          最近更新 更多