Арифметика с плавающей запятой, сложная тема, которую часто неправильно понимают, широко распространена в современных компьютерных системах. Поскольку большинству дробных чисел не хватает точного двоичного представления, неизбежно происходит округление. Понимание нюансов операций с плавающей запятой имеет решающее значение, как указано в статье «Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой».
Ответ: Нет, вы не можете полагаться на настройки точности php.ini для обеспечения постоянной двухзначной точности, даже для чисел ниже 10^6, потому что точность длина может увеличиваться во время вычислений.
Ответ: Рассмотрим следующий пример со скидкой 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
Ответ: Точность 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