Добавление положительных и отрицательных плавающих чисел PHP: возвращение экспоненциального числа - PullRequest
0 голосов
/ 09 января 2020

У меня есть много массивов с некоторыми положительными и отрицательными числами, и мне нужно сделать сложение каждого из них. Если какой-либо массив имеет те же числа, которые должны возвращать 0, но он возвращает экспоненциальные данные.

$arr=[
  '-20.91',
  '-34.48',
  '-5.18',
  '34.48',
  '20.91',
  '5.18'
];
$total = 0;
foreach($arr as $ar){
  $total+=$ar;
}
echo $total;

Этот код должен дать мне вывод в виде 0, но он возвращает -3.5527136788005E-15 если я напишу

echo round($total);

, это показывает -0 .
Если возможно, кто-нибудь может помочь мне получить правильный результат с округлением до 2?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 09 января 2020

Показатель степени равен -15, число невероятно мало и является результатом округления в IEEE с плавающей запятой представление чисел.

Чтобы понять, в чем проблема Вы можете проверить этот пример кода:

<?php

$arr=[
  '-20.91',
  '-34.48',
  '-5.18',
  '34.48',
  '20.91',
  '5.18'
];

foreach ($arr as $float) {
    printf("%.30f\n", (float)$float);
}

Демо

Если вы хотите избежать этой проблемы, вам нужно будет округлить ее или убедиться, что вы работаете в числах, которые всегда являются суммами степеней 2 (так для дробей: 0,5, 0,25, 0,125, 0,0625 и т. д. c).

0 голосов
/ 09 января 2020

помогите мне понять это

Числа с плавающей запятой, использующие двоичное кодирование, не могут представлять точно числа

'- 20,91', '- 34,48 ',' -5,18 ', '34 .48', '20 .91 ',' 5.18 '

Вместо этого используются близлежащие значения. Сумма из них составляет около -3,5527136788005E-15, а не 0.


Сумма верна. Ожидание, что вычисленная сумма должна быть 0, не равно.

...