Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah saya Bergantung pada Ketepatan `php.ini` PHP untuk Pengiraan Wang Tepat?

Bolehkah saya Bergantung pada Ketepatan `php.ini` PHP untuk Pengiraan Wang Tepat?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-06 10:27:02816semak imbas

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

Bolehkah saya Bergantung pada PHP php.ini Penyelesaian Ketepatan untuk Isu Titik Terapung?

Pengenalan

;

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."

Soalan dan Jawapan


< h3>Soalan 1: Bolehkah saya menggunakan penyelesaian ketepatan untuk pengiraan 2 digit yang tepat (cth., wang)?

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.

Soalan 2: Berikan contoh yang jelas di mana penyelesaian ketepatan gagal.

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

Soalan 3: Nilai php.ini.precision yang manakah sesuai untuk pengiraan wang 2 digit?

Jawapan: Tetapan ketepatan PHP bukanlah asas yang boleh dipercayai untuk pengiraan kewangan atau ketepatan titik terapung. Lebih baik menggunakan perpustakaan atau kaedah khusus.

Contoh Pengiraan

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

Kesimpulan

Untuk pengiraan kewangan yang boleh dipercayai, lupakan titik terapung dan gunakan sen atau pertimbangkan fungsi format_nombor untuk ketepatan 2 digit yang konsisten.

Kemas kini

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn