2016-11-15 4 views
0

Я получаю список значений из моей базы данных, и я добавляю их, чтобы получить сумму всех строк. PHP не делает правильно, и я не могу понять, почему. Я работаю с тем, что делаю. Результат должен быть равен нулю, но PHP вычисляет результат как $ -1.78. Что плохого в следующем:PHP, добавляющий список значений, не является корректным

public function testAddition() 
{ 
    $data = ['23.21','-38.20','14.99','0.00']; 
    $total = 0; 
    foreach ($data as $value) { 
    $total += round(floatval($value), 2); 
    var_dump($value); // value to add 
    var_dump($total); // new total 
    } 
    // PHPunit results a success to zero, this is wrong, $total = -1.776... 
    $this->assertEquals(0, $total); 
} 

Результаты следующие:

string(5) "23.21" // value to add 
float(23.21) // new total 
string(6) "-38.20" // value to add 
float(-14.99) // new total 
string(5) "14.99" // value to add 
float(-1.7763568394003E-15) // <-- this is wrong, should be zero 
string(4) "0.00" // value to add 
float(-1.7763568394003E-15) // new total 

ответ

1

В результате -1.7763568394003E-15 или +0,0000000000000017763568394003; который, когда «закруглен» = 0,00. Это просто проблема расчета чисел как «поплавок» - там почти всегда будут небольшие остатки где-то

Решение также должно округлить результат? Или умножить на 100 и использовать (int), а затем снова делить на 100 (хотя теоретически теоретически может остаться остаток)

Кроме того, хотя он не отвечает на ваш вопрос, вам не нужен floatval, вы можете просто используйте $total += round($value, 2);, поскольку PHP делает это для вас.

+0

Спасибо Я нашел свою ошибку сразу после публикации этого. Наша форма HTML будет форматировать валюту с помощью «12, 345,67». У нас есть обычная подпрограмма, которая не переносит числовую строку из входной строки перед преобразованием в float, которая лишает экспонента. Глупый вопрос. – user3720435