jQuery中的计算得出结果“ NaN”

时间:2019-04-11 05:32:10

标签: javascript jquery

尝试使用jquery进行一些计算:

运行以下代码段:输入值

  

数量为 1

     

111

的价格购买      

111.22

的价格出售

结果将为 NaN

为什么会这样?如何解决此问题?

function roundToTwo(num) {
  return +(Math.round(num + "e+2") + "e-2");
}


$("#quantity, #buy, #sell").on("change keyup paste", function() {
  var quantity = Number($('#quantity').val());
  var buy = Number($("#buy").val());
  var sell = Number($("#sell").val());


  var total_amnt_trade = roundToTwo((quantity * buy) + (quantity * sell));
  var brokerage_amnt_buy = ((buy * quantity) * 0.08) / 100;
  if (brokerage_amnt_buy >= 25) {
    var brokerage_buy = 25;
  } else {
    var brokerage_buy = brokerage_amnt_buy;
  }
  var brokerage_amnt_sell = ((sell * quantity) * 0.08) / 100;
  if (brokerage_amnt_sell >= 25) {
    var brokerage_sell = 25;
  } else {
    var brokerage_sell = brokerage_amnt_sell;
  }
  var brokerage = roundToTwo(brokerage_buy + brokerage_sell); //brokerage
  var transaction_charges = roundToTwo((((buy * quantity) + (sell * quantity)) * 0.00325) / 100); //Transaction Charges
  var gst = roundToTwo((((transaction_charges * 18) / 100) + (brokerage * 18) / 100)); //GST

  var total_charges = roundToTwo(brokerage + transaction_charges + gst);
  var pnl = roundToTwo(((sell - buy) * quantity) - total_charges);

  $('#pnl_display').text(pnl);


})
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>


<table class="table table-borderless">
  <tbody>
    <tr style="text-align: center;">
      <td><b>Quantity</b></td>
      <td><b>Buy</b></td>
      <td><b>Sell</b></td>
    </tr>
    <tr>
      <td><input type="number" class="form-control" id="quantity" placeholder="Quantity" name="quantity"></td>
      <td><input type="number" class="form-control" id="buy" placeholder="Buy Amount" name="buy"></td>
      <td><input type="number" class="form-control" id="sell" placeholder="Sell Amount" name="sell"></td>
    </tr>

    <tr id="pnl_color">
      <td><span id="pnl_text_display">Profit / Loss</span></td>
      <td><span id="pnl_display"></span></td>
    </tr>

  </tbody>
</table>

运行上面的代码片段:输入值

  

数量为 1

     

111

的价格购买      

111.22

的价格出售

结果将为 NaN

为什么会这样?如何解决此问题?

4 个答案:

答案 0 :(得分:0)

您可以使用roundToTwo而不是.tofixed(2)来解决问题。因为您的答案以e(-1.1379786002407855855e-15)返回,所以它显示为NaN

 var pnl = parseFloat(((sell - buy) * quantity) - total_charges).toFixed(2);

function roundToTwo(num) {
  return +(Math.round(num + "e+2") + "e-2");
}


$("#quantity, #buy, #sell").on("change keyup paste", function() {
  var quantity = Number($('#quantity').val());
  var buy = Number($("#buy").val());
  var sell = Number($("#sell").val());


  var total_amnt_trade = roundToTwo((quantity * buy) + (quantity * sell));
  var brokerage_amnt_buy = ((buy * quantity) * 0.08) / 100;
  if (brokerage_amnt_buy >= 25) {
    var brokerage_buy = 25;
  } else {
    var brokerage_buy = brokerage_amnt_buy;
  }
  var brokerage_amnt_sell = ((sell * quantity) * 0.08) / 100;
  if (brokerage_amnt_sell >= 25) {
    var brokerage_sell = 25;
  } else {
    var brokerage_sell = brokerage_amnt_sell;
  }
  var brokerage = roundToTwo(brokerage_buy + brokerage_sell); //brokerage
  var transaction_charges = roundToTwo((((buy * quantity) + (sell * quantity)) * 0.00325) / 100); //Transaction Charges
  var gst = roundToTwo((((transaction_charges * 18) / 100) + (brokerage * 18) / 100)); //GST

  var total_charges = roundToTwo(brokerage + transaction_charges + gst);
  var pnl = parseFloat(((sell - buy) * quantity) - total_charges).toFixed(5);
 pnl = roundToTwo(pnl);
  $('#pnl_display').text(pnl);


})
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>


<table class="table table-borderless">
  <tbody>
    <tr style="text-align: center;">
      <td><b>Quantity</b></td>
      <td><b>Buy</b></td>
      <td><b>Sell</b></td>
    </tr>
    <tr>
      <td><input type="number" class="form-control" id="quantity" placeholder="Quantity" name="quantity"></td>
      <td><input type="number" class="form-control" id="buy" placeholder="Buy Amount" name="buy"></td>
      <td><input type="number" class="form-control" id="sell" placeholder="Sell Amount" name="sell"></td>
    </tr>

    <tr id="pnl_color">
      <td><span id="pnl_text_display">Profit / Loss</span></td>
      <td><span id="pnl_display"></span></td>
    </tr>

  </tbody>
</table>

答案 1 :(得分:0)

我修改了您的roundToTwo()函数以处理精度错误:

function roundToTwo(num) {
  return parseFloat(num.toFixed(2));
}


$("#quantity, #buy, #sell").on("change keyup paste", function() {
  var quantity = Number($('#quantity').val());
  var buy = Number($("#buy").val());
  var sell = Number($("#sell").val());


  var total_amnt_trade = roundToTwo((quantity * buy) + (quantity * sell));
  var brokerage_amnt_buy = ((buy * quantity) * 0.08) / 100;
  if (brokerage_amnt_buy >= 25) {
    var brokerage_buy = 25;
  } else {
    var brokerage_buy = brokerage_amnt_buy;
  }
  var brokerage_amnt_sell = ((sell * quantity) * 0.08) / 100;
  if (brokerage_amnt_sell >= 25) {
    var brokerage_sell = 25;
  } else {
    var brokerage_sell = brokerage_amnt_sell;
  }
  var brokerage = roundToTwo(brokerage_buy + brokerage_sell); //brokerage
  var transaction_charges = roundToTwo((((buy * quantity) + (sell * quantity)) * 0.00325) / 100); //Transaction Charges
  var gst = roundToTwo((((transaction_charges * 18) / 100) + (brokerage * 18) / 100)); //GST

  var total_charges = roundToTwo(brokerage + transaction_charges + gst);
  var pnl = roundToTwo(((sell - buy) * quantity) - total_charges);

  $('#pnl_display').text(pnl);


})
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>


<table class="table table-borderless">
  <tbody>
    <tr style="text-align: center;">
      <td><b>Quantity</b></td>
      <td><b>Buy</b></td>
      <td><b>Sell</b></td>
    </tr>
    <tr>
      <td><input type="number" class="form-control" id="quantity" placeholder="Quantity" name="quantity"></td>
      <td><input type="number" class="form-control" id="buy" placeholder="Buy Amount" name="buy"></td>
      <td><input type="number" class="form-control" id="sell" placeholder="Sell Amount" name="sell"></td>
    </tr>

    <tr id="pnl_color">
      <td><span id="pnl_text_display">Profit / Loss</span></td>
      <td><span id="pnl_display"></span></td>
    </tr>

  </tbody>
</table>

答案 2 :(得分:0)

@Orever您可以将((return +(Math.round(num +“ e + 2”)+“ e-2”)+“ e-2”);)替换为(return +(Math.round(num * 100 )/ 100);)中的函数roundToTwo(num)。 因此您的代码将是

function roundToTwo(num) {
   return +(Math.round(num * 100) / 100);
}

答案 3 :(得分:-2)

当它评估((出售-购买)*数量)时,total_charges其得到-1.1379786002407407855e-15。 roundToTwo(-1.1379786002407855e-15)获得NaN,因此失败。如果更改为roundToTwo((sell-购买)*数量),则它将起作用。或使用 toFixed

更改roundToTwo函数

function roundToTwo(num) {
  return +(Math.round(num + "e+2") + "e-2");
}


$("#quantity, #buy, #sell").on("change keyup paste", function() {
  var quantity = Number($('#quantity').val());
  var buy = Number($("#buy").val());
  var sell = Number($("#sell").val());


  var total_amnt_trade = roundToTwo((quantity * buy) + (quantity * sell));
  var brokerage_amnt_buy = ((buy * quantity) * 0.08) / 100;
  if (brokerage_amnt_buy >= 25) {
    var brokerage_buy = 25;
  } else {
    var brokerage_buy = brokerage_amnt_buy;
  }
  var brokerage_amnt_sell = ((sell * quantity) * 0.08) / 100;
  if (brokerage_amnt_sell >= 25) {
    var brokerage_sell = 25;
  } else {
    var brokerage_sell = brokerage_amnt_sell;
  }
  var brokerage = roundToTwo(brokerage_buy + brokerage_sell); //brokerage
  var transaction_charges = roundToTwo((((buy * quantity) + (sell * quantity)) * 0.00325) / 100); //Transaction Charges
  var gst = roundToTwo((((transaction_charges * 18) / 100) + (brokerage * 18) / 100)); //GST

  var total_charges = roundToTwo(brokerage + transaction_charges + gst);
  var pnl = roundToTwo(roundToTwo((sell - buy) * quantity) - total_charges);

  $('#pnl_display').text(pnl);


})
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>


<table class="table table-borderless">
  <tbody>
    <tr style="text-align: center;">
      <td><b>Quantity</b></td>
      <td><b>Buy</b></td>
      <td><b>Sell</b></td>
    </tr>
    <tr>
      <td><input type="number" class="form-control" id="quantity" placeholder="Quantity" name="quantity"></td>
      <td><input type="number" class="form-control" id="buy" placeholder="Buy Amount" name="buy"></td>
      <td><input type="number" class="form-control" id="sell" placeholder="Sell Amount" name="sell"></td>
    </tr>

    <tr id="pnl_color">
      <td><span id="pnl_text_display">Profit / Loss</span></td>
      <td><span id="pnl_display"></span></td>
    </tr>

  </tbody>
</table>