Расчеты Javascript и php несоответствие - PullRequest
2 голосов
/ 10 мая 2019

Я должен сделать некоторые вычисления в 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
?>

Оба дают разные результаты. Поэтому мне нужно либо 176,74, либо 176,73 как для JavaScript, так и для PHP.

1 Ответ

0 голосов
/ 10 мая 2019

Чтобы получить желаемое число десятичной точности, Math.round требует умножения с последующим делением (метод «умножения и деления»).

Этот метод «умножить и разделить» может вызвать ошибку округления, но, очевидно, этого можно избежать, увеличивая, а затем понижая показатель степени (назовите этот метод «экспонентой»).

Метод «умножения и деления»:

Math.round(num*100)/100

Метод экспоненты:

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

Попробуйте приведенный ниже фрагмент с num1 = 1.005, num2 = 1, decimals = 2. Метод «умножения и деления» ошибается, метод экспоненты - правильно.

/* 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...