Aritmetik titik terapung, subjek kompleks yang sering disalahfahamkan, merangkumi sistem komputer moden. Oleh kerana kebanyakan nombor pecahan tidak mempunyai perwakilan binari yang tepat, pembundaran tidak dapat dielakkan berlaku. Memahami nuansa operasi titik terapung adalah penting, seperti yang digariskan dalam "Apa Yang Setiap Saintis Komputer Patut Tahu Mengenai Aritmetik Titik Terapung."
Jawapan: Tidak, anda tidak boleh bergantung pada php. ini tetapan ketepatan untuk ketepatan 2 digit yang konsisten, walaupun untuk nombor di bawah 10^6, kerana panjang ketepatan boleh meningkat semasa pengiraan.
Jawapan: Pertimbangkan contoh berikut dengan diskaun 10% digunakan hanya untuk kilogram pertama:
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;
Output: 14.5824 <- --- bukan pengiraan 2 digit yang tepat
Jawapan: Tetapan ketepatan PHP bukanlah asas yang boleh dipercayai untuk pengiraan kewangan atau ketepatan titik terapung. Lebih baik menggunakan perpustakaan atau kaedah khusus.
Mari kita periksa pelbagai contoh untuk menggambarkan had ketepatan:
$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
Untuk pengiraan kewangan yang boleh dipercayai, lupakan titik terapung dan gunakan sen atau pertimbangkan fungsi format_nombor untuk ketepatan 2 digit yang konsisten.
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;
Atas ialah kandungan terperinci Bolehkah saya Bergantung pada Ketepatan `php.ini` PHP untuk Pengiraan Wang Tepat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!