是否.toFixed()导致不正确的计算?

问题描述 投票:2回答:2

我创建一个简单的计算器显示最少数量的必要硬币,使变化量。用户输入的变化量,并且所述函数输出宿舍,硬币,尼克尔斯,和必要的便士的数目。该代码似乎完全发挥功能,除非百位数(便士位)是一个3或8在这种情况下,它输出一个比所需更少便士。这是不正确的输出造成在这种情况下使用Math.ceil或toFixed的?什么可以代替?

我在和显示硬币的非整数作为解决方案的窗口,这就是为什么我开始使用Math.ceil()和toFixed()的问题。

function changeCalc() {
  let a = document.getElementById("changeTotal").value;
  let b = (a % 0.25).toFixed(2);
  let quartersNum = Math.ceil((a - b) / 0.25);
  if (b > 0) {
    var c = (b % 0.1).toFixed(2);
    var dimesNum = Math.ceil((b - c) / 0.1);
    if (c > 0) {
      var d = (c % 0.05).toFixed(2);
      var nicklesNum = Math.ceil((c - d) / 0.05);
      if (d > 0) {
        var e = (d % 0.01).toFixed(2);
        var penniesNum = Math.ceil((d - e) / 0.01);
        document.getElementById("changeWindow").innerHTML =
          `${quartersNum} quarters, ${dimesNum} dimes, ${nicklesNum} nickles, 
            ${penniesNum} pennies`;
      } else {
        document.getElementById("changeWindow").innerHTML =
          `${quartersNum} quarters, ${dimesNum} dimes, ${nicklesNum} 
               nickles`;
      }
    } else {
      document.getElementById("changeWindow").innerHTML =
        `${quartersNum} quarters, ${dimesNum} dimes`;
    }
  } else {
    document.getElementById("changeWindow").innerHTML =
      `${quartersNum} quarters`;
  }
}

例如,当我输入0.18作为变化值,我期望输出是4分之0,1枚硬币,1个尼克尔斯和3个便士。相反,输出为0季度,1枚硬币,1个尼克尔斯,和2个便士。

javascript
2个回答
0
投票

这是不是真的有toFixed()ceil()但更准确地说是Floating-Point Imprecision问题的一个问题,尤其是与javascript

有解决它的方法很多,但是对于你的问题,它通常通过使用不必如处理浮点数的解决方案解决乘以100最初的数字拿到18,那么你会完全避免这个问题。

function changeCalc(inputString) {
  let a = parseInt(inputString * 100);
  let b = a % 25;
  let quartersNum = Math.floor(a / 25);
  if (b > 0) {
    var c = b % 10;
    var dimesNum = Math.floor(b / 10);
    if (c > 0) {
      var d = c % 5;
      var nicklesNum = Math.floor(c / 5);
      if (d > 0) {
        var penniesNum = d;
        console.log(
          `${quartersNum} quarters, ${dimesNum} dimes, ${nicklesNum} nickles, 
        ${penniesNum} pennies`);
      } else {
        console.log(
          `${quartersNum} quarters, ${dimesNum} dimes, ${nicklesNum} 
           nickles`);
      }
    } else {
      console.log(
        `${quartersNum} quarters, ${dimesNum} dimes`);
    }
  } else {
    console.log(
      `${quartersNum} quarters`);
  }
}

console.log("$0.18 is:");
changeCalc("0.18");

console.log("$0.24 is:");
changeCalc("0.24");

console.log("$0.33 is:");
changeCalc("0.33");

0
投票

是的的确如此。

在你的情况:每次d = 0.03,E将是0.01,因为(0.03%0.01)将被计算为0.009999999999999998将由.toFixed评价T0 0.01(2)。

但是,对于您的问题,这可能是如果u改变解决

if (d > 0) {
   var e = (d % 0.01).toFixed(2);
   var penniesNum = Math.ceil((d - e) / 0.01);

if (d > 0) {
   var penniesNum = Math.ceil((d) / 0.01);

我希望这有助于你以某种方式。

© www.soinside.com 2019 - 2024. All rights reserved.