【问题标题】:Javascript calculations and php calculations mismatchJavascript 计算和 php 计算不匹配
【发布时间】:2019-05-10 16:41:11
【问题描述】:

我必须在客户端的 JavaScript 中进行一些计算,并且当用户单击提交时我必须在 PHP 中进行验证。这样做时,我会在 PHP 和 JavaScript 中得到不同的结果。

我有以下问题。

1。 JavaScript 计算在小数点后给出额外的数字。

2。 JavaScript 计算和 PHP 计算在后端验证时不匹配。

<script type="text/javascript">
var a = 130;
var b = 1.3595;
var c = a * b;
console.log(c);  //176.73499999999999
console.log(c.toFixed(2));  //176.73
</script>

<?php
$a = 130;
$b = 1.3595;
$c = $a * $b;
echo $c; //176.735
echo round($c,2); //176.74
?>

两者都给出不同的结果。所以我想要的是 JavaScript 和 PHP 上的 176.74 或 176.73。

【问题讨论】:

  • Javascript 只是去掉小数位,而 php 将数字四舍五入,这就是为什么它要高一个小数点
  • 告诉JS四舍五入,你会有同样的答案
  • @Tudor 看看第一个回声/打印 - 数学 130 * 1.3595 的实际结果是不同的,不仅是一个削减,而其他轮。那是因为我们正在处理浮点数学,它有时可能略微不正确。
  • PHP 是四舍五入,JS 是截断

标签: javascript php calculation


【解决方案1】:

要获得所需的小数精度,Math.round 需要先乘法再除法(“乘除法”方法)。

这种“multiply-and=divide”方法会产生舍入误差,但显然可以通过提高然后降低数字的指数来避免这种情况(称为“exponent”方法)。

“乘除法”:

Math.round(num*100)/100

“指数”法:

Number(Math.round(num+'e2') + 'e-2')

用 num1 = 1.005, num2 = 1, decimals = 2 试试下面的 sn-p。“乘除法”错误,“指数”法正确。

/* the "multiply-and-divide" rounding method */
function roundmult(value, decimals) {
  let multiplier = 1;
  for (let i = 0; i < decimals; i++) {
    multiplier *= 10;
  }
  return Math.round(value * multiplier) / multiplier;
}

/* the "exponent" rounding method */
function roundexp(value, decimals) {
  return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals);
}

function testIt() {
  let decimals = +(document.getElementById("decimals").value);
  let num1 = +(document.getElementById("num1").value);
  let num2 = +(document.getElementById("num2").value);

  let product = num1 * num2;
  let resultmult = roundmult(product, decimals);
  document.getElementById("multdiv").innerText = resultmult;
  let resultexp = roundexp(product, decimals);
  document.getElementById("exponent").innerText = resultexp;
}
<h1>
  Math.round() Test
</h1>
<label for="num1">num1</label>
<input id="num1" type="number"> times
<label for="num2">num2</label>
<input id="num2" type="number"><br />
<label for="decimals">decimal places:</label>
<input id="decimals" type="number"><br /><br />
<button id="doit" onclick="testIt();">
Round it!
</button><br /><br /> The "multiply and divde" method result is: <span id="multdiv"></span>
<br /><br /> The "exponent" method result is: <span id="exponent"></span>

【讨论】:

  • 我已经检查过了。对于某些值,它给出了正确的答案,而对于某些值,它不是。你能检查一下这个值 40.785 吗?在 PHP 中是 40.79,在 JS 中是 40.78
  • @svkks - 请参阅上面的更新答案。 sn-p使用了两种不同的方法,请试一试。
猜你喜欢
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 2015-06-25
  • 2021-02-06
  • 1970-01-01
  • 2014-08-10
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多