PHP округление проблемы (5.2.3)?

Я задаюсь вопросом, нашел ли я проблему с округлением в PHP, конкретно 5.2.3 (я не уверен в других версиях в данный момент):

$t = 0;

$taxAmount = (5.000 / 100) * 0.7;
$t += $taxAmount;

var_dump($t); // float(0.035)
var_dump(round($t, 2)); // float(0.03)
var_dump(number_format($t, 2)); // string(4) "0.03"

Мне 0.035 должен вокруг к 0,04, или я являюсь просто сумасшедшим?

Править

Thxs к ответу NebyGemini, я полагал, что сделаю это вместо этого:

$t = 0;

$taxAmount = bcmul(bcdiv(5.000, 100, 3), 0.7, 3);
$t += $taxAmount;

var_dump($t); // float(0.035)
var_dump(round($t, 2)); // float(0.04)
var_dump(number_format($t, 2)); // string(4) "0.04"

Который работает прекрасный.

BTW, я вычисляю налог в корзине. Общее количество порядка 0,70 (70 центов), и налог составляет 5%.

Править

Thxs к ответу Ignacio Vazquez-Abrams's, это должно показать, где проблема заключается:

printf('%.18F', 5.000 / 100 * 0.7);

7
задан Community 23 May 2017 в 10:24
поделиться

3 ответа

Поплавки - это зло.

Цитирование документации руководства PHP по на номера плавающих точек :

Поэтому никогда не доверяйте результатам чисел с плавающей точкой последней цифре, и никогда не сравнивайте числа с плавающей точкой для равенства. Если необходима более высокая точность, то доступны функции произвольной точности математические функции и gmp.

Если вы хотите знать, почему и как работают флоты, я рекомендую посмотреть:
Все, что вы не хотели знать о числах JavaScript

7
ответ дан 7 December 2019 в 01:20
поделиться

Вы можете использовать PHP_ROUND_HALF_UP, но есть проблема, который номер самостоятельно преобразован в «99999 ...»

0
ответ дан 7 December 2019 в 01:20
поделиться

Python говорит:

>>> repr(5./100*0.7)
'0.034999999999999996'

Это связано с ограничениями точности IEEE754. Используйте тип фиксированной точки, если вам нужна точная точность.

3
ответ дан 7 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: