【问题标题】:Rounding Issue with Javascript using Math使用数学的 Javascript 舍入问题
【发布时间】:2021-10-13 13:45:26
【问题描述】:

我正在做一个项目,我有一个输入字段,用户可以在其中输入美元金额,并根据他们愿意支付的频率将该金额除以所述值(2、4 或 12)。因此,例如,如果我输入 5 美元并将频率设置为 2,我会让它显示 2.50 美元的收费金额。我遇到的问题是,如果用户输入 20.27 美元,频率设置为 2,我希望看到 10.14 美元作为显示,但由于某种原因,即使在使用 Math.round 和 toFixed(2) 之后,我也会得到 10.13 美元。如果我输入 2.27 美元或 0.27 美元,我确实会分别得到预期的 1.14 美元和 0.14 美元,但一旦超过 10 美元,它就不再正确舍入。我无法弄清楚我做错了什么。这是我的代码:

const setAmount = (num) => {
        scope.selectAmount(selectedAmount / num);
        finalAmount = ((Math.round(selectedAmount * 100) / 100) / num).toFixed(2);
        selectedAmountText = '$' + finalAmount;
        $('#pay-schedule span').text(selectedAmountText);

    }

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 它坏了 - 以什么方式?
  • 它在某种意义上中断了,它开始向下舍入到 $x.13 而不是 $x.27 示例中的 $x.14。
  • 如果您输入 4.27 美元,则四舍五入为 2.14 美元。如果您输入 10.27 美元,则四舍五入为 5.13 美元。
  • 你总是希望它四舍五入吗?
  • 我只是希望它四舍五入到以美分为单位的适当整数。因此,当原始金额为 2.135 美元(来自上面的示例)时,我希望它适当地四舍五入到 2.14 美元。如果输入数字的除法结果是 2.132 美元,我希望它会四舍五入到 2.13 美元。

标签: javascript math rounding number-formatting


【解决方案1】:

更改顺序如下:

finalAmount = ((Math.round(selectedAmount / num * 100) / 100)).toFixed(2);

以后再分会搞砸。

【讨论】:

    【解决方案2】:

    对此我没有确切的解释,但最后除以 2 会使它有些不一致。因此,首先将数字除以 2 可以解决您提供的特定值的问题。

    function round(num) {
      let val = num / 2
      return (Math.round(val * 100) / 100).toFixed(2);
    }
    

    【讨论】:

      【解决方案3】:

      我不确定你为什么需要toFixed()。

      var amount=20.27;
      var frequency=2;
      var finalamount=amount/frequency;
      finalamountrounded=Math.round(finalamount * 100) / 100
      console.log(finalamountrounded)
      

      生产

      10.14
      

      【讨论】:

        【解决方案4】:

        问题是,数字 20.27 不存在。在输入时,它被四舍五入到最接近的可能值:

        var a = 20.27;
        a.toFixed(18) // output: "20.269999999999999574"
        var b = a/2;
        b.toFixed(18); // output: "10.134999999999999787"
        

        我使用toFixed(18),因为它显示所有相关数字。从这个角度来看,10.13 是正确的预期值。

        使用Math.round(b*100)/100 进行舍入可以解决此示例,但可能会产生其他错误。这里 b*100 被四舍五入到下一个整数。在这种情况下,除以 100 会返回值 >10.14(而不是 =10.14)。

        c = Math.round(b*100);
        c.toFixed(18); // output: "1014.000000000000000000"
        (c/100).toFixed(18); // output: "10.140000000000000568"
        

        这个数字问题在所有支持 IEEE 浮点数的语言中都很常见。这就是财务软件使用美分或例如的原因。 BCD(二进制编码的十进制)数字。这就是许多金融程序使用旧的编程语言 COBOL 的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-03
          • 2020-09-17
          • 1970-01-01
          • 2015-08-03
          • 1970-01-01
          相关资源
          最近更新 更多