«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Могу ли я положиться на точность PHP php.ini для точных расчетов денег?

Могу ли я положиться на точность PHP php.ini для точных расчетов денег?

Опубликовано 19 ноября 2024 г.
Просматривать:706

 Can I Rely on PHP's `php.ini` Precision for Accurate Money Calculations?

Могу ли я положиться на прецизионный обходной путь PHP php.ini для решения проблем с плавающей запятой?

Введение

Арифметика с плавающей запятой, сложная тема, которую часто неправильно понимают, широко распространена в современных компьютерных системах. Поскольку большинству дробных чисел не хватает точного двоичного представления, неизбежно происходит округление. Понимание нюансов операций с плавающей запятой имеет решающее значение, как указано в статье «Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой».

Вопросы и ответы


Вопрос 1. Могу ли я использовать обходной путь для точных двузначных вычислений (например, деньги)?

Ответ: Нет, вы не можете полагаться на настройки точности php.ini для обеспечения постоянной двухзначной точности, даже для чисел ниже 10^6, потому что точность длина может увеличиваться во время вычислений.

Вопрос 2. Приведите наглядный пример обходного пути повышения точности. не получается.

Ответ: Рассмотрим следующий пример со скидкой 10 %, применяемой только к первому килограмму:

ini_set('precision', 8); // Your precision
$a = 5.88; // Cost of 1kg
$q = 2.49; // User buys 2.49 kg
$b = $a * 0.01; // 10% Discount only on the first kg
echo ($a * $q) - $b;

Вывод: 14.5824

Вопрос 3: Какой php.ini Значение .precision подходит для двузначных денежных расчетов?

Ответ: Точность PHP настройки не являются надежной основой для финансовых расчетов или точности чисел с плавающей запятой. Лучше использовать специализированные библиотеки или методы.

Примеры вычислений

Давайте рассмотрим различные примеры, иллюстрирующие ограничения точности:

$a = 342349.23;
$b = 341765.07;

// Example A: precision = 20
echo $a - $b, PHP_EOL; // 584.15999999997438863
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.15999999999996817 (rounding introduces instability)
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.15

// Example B: precision = 14
echo $a - $b, PHP_EOL; // 584.15999999997
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.16

// Example C: precision = 6
echo $a - $b, PHP_EOL; // 584.16
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.00

// Example D: precision = 3
echo $a - $b, PHP_EOL; // 584
echo floatval(round($a - $b, 2)), PHP_EOL; // 584
echo number_format($a - $b, 2), PHP_EOL; // 584.16 (consistent)
echo bcsub($a, $b, 2), PHP_EOL; // 0.00

Эти примеры демонстрируют несоответствие использования настроек точности PHP для точных расчетов.

Вывод

Для надежных финансовых расчетов забудьте о плавающей запятой и используйте центы или рассмотрите функцию number_format для согласованного двухзначного числа точность.

Обновление

ini_set('precision', 8);

$a = 0.19;
$b = 0.16;
$c = 0.01;
$d = 0.01;
$e = 0.01;
$f = 0.01;
$g = 0.01;
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3