Rumah >pembangunan bahagian belakang >masalah PHP >Adakah operasi titik terapung dalam PHP tepat?
Tidak, terdapat ralat dalam operasi titik terapung di bawah PHP. Dalam PHP, nombor titik terapung mempunyai ketepatan yang terhad, walaupun bergantung pada sistem, PHP secara amnya menggunakan format ketepatan berganda IEEE 754, ralat relatif maksimum akibat pembundaran ialah "1.11e-16" operasi matematik bukan asas mungkin memberikan A lebih besar ralat akan berlaku, dan penyebaran ralat semasa menjalankan operasi komposit mesti diambil kira.
Persekitaran pengendalian tutorial ini: sistem Windows 7, versi PHP 8, komputer DELL G3
//加 $a = 0.1; $b = 0.7; $c = intval(($a + $b) * 10); echo $c."<br>"; //输出:7 //减 $a = 100; $b = 99.98; $c = $a - $b; echo $c."<br>"; //输出:0.019999999999996 //乘 $a = 0.58; $b = 100; $c = intval($a * $b); echo $c."<br>"; //输出:57 //除 $a = 0.7; $b = 0.1; $c = intval($a / $b); echo $c."<br>"; //输出:6
Hasil di atas jelas sekali bukan yang kita mahukan!
Manual PHP rasmi menerangkannya seperti berikut:
Nombor titik terapung mempunyai ketepatan yang terhad. Walaupun ia bergantung kepada sistem, PHP biasanya menggunakan format berganda IEEE 754, jadi ralat relatif maksimum akibat pembundaran ialah 1.11e-16. Operasi matematik bukan asas mungkin memberikan ralat yang lebih besar, dan perambatan ralat semasa melakukan operasi gabungan perlu diambil kira. Jangan sekali-kali mempercayai hasil titik terapung kepada digit terakhir, dan jangan sekali-kali membandingkan dua nombor titik terapung untuk kesamaan. Jika anda benar-benar memerlukan ketepatan yang lebih tinggi, anda harus menggunakan fungsi matematik ketepatan arbitrari atau fungsi gmp.
Kuncinya di sini ialah perpuluhan nombor titik terapung dinyatakan dalam perduaan Prosesnya adalah seperti berikut:
Untuk matematik ketepatan arbitrari, PHP menyediakan pengiraan binari yang menyokong nombor sebarang saiz dan ketepatan yang diwakili oleh rentetan.
BCMath: BC ialah singkatan Kalkulator Binari.
Manual rasmi: http://php.net/manual/zh/book.bc.php
bccomp membandingkan dua nombor ketepatan arbitrari
bcmod membandingkan Modulo nombor ketepatan arbitrariKuasa bcpow nombor ketepatan sewenang-wenang
Modul bcpowmod kuasa nombor ketepatan tinggi
//加 $a = 0.1; $b = 0.7; $c = intval(bcadd($a, $b, 1) * 10); echo $c."<br>"; //输出:8 //减 $a = 100; $b = 99.98; $c = bcsub($a, $b, 2); echo $c."<br>"; //输出:0.02 //乘 $a = 0.58; $b = 100; $c = intval(bcmul($a, $b)); echo $c."<br>"; //输出:58 //除 $a = 0.7; $b = 0.1; $c = intval(bcdiv($a, $b)); echo $c."<br>"; //输出:7skala bc Tetapkan nombor lalai tempat perpuluhan untuk semua bc fungsi matematikbcsqrt Punca kuadratik sebarang nombor ketepatan
echo floor(5.1); //输出:5 echo floor(8.8); //输出:8
echo ceil(5.1); //输出:6 echo ceil(8.8); //输出:91 = 1.29 -> Jika lima selepas lima tidak kosong, tambahkan satu
echo round(5.1); //输出:5 echo round(8.8); //输出:9 //保留两位小数并且进行四舍五入 echo round(5.123, 2); //输出:5.12 echo round(8.888, 2); //输出:8.89 //保留两位小数并且不进行四舍五入 echo substr(round(5.12345, 3), 0, -1); //输出:5.12 echo substr(round(8.88888, 3), 0, -1); //输出:8.88
Untuk lebih banyak arahan penggunaan bulat, sila semak manual rasmi:
http://php.net/manual/zh/function.round.php
medan titik terapung MySQL
echo round(1.2849, 2, PHP_ROUND_HALF_EVEN); //输出:1.28 echo round(1.2866, 2, PHP_ROUND_HALF_EVEN); //输出:1.29 echo round(1.2851, 2, PHP_ROUND_HALF_EVEN); //输出:1.29 echo round(1.2850, 2, PHP_ROUND_HALF_EVEN); //输出:1.28 echo round(1.2750, 2, PHP_ROUND_HALF_EVEN); //输出:1.28
Dalam MySQL, terdapat juga nombor titik terapung semasa membuat jadual jenis medan. Jenis nombor titik terapung termasuk nombor titik terapung ketepatan tunggal (terapung) dan nombor titik terapung berketepatan dua (berganda).
Terdapat ralat dalam nombor titik terapung Apabila kami menggunakan data sensitif ketepatan, kami harus menggunakan nombor titik tetap (perpuluhan) untuk penyimpanan.
Melalui isu ketepatan titik terapung, kami mengetahui bahawa perpuluhan nombor titik terapung diwakili dalam binari.
berkongsi penggunaan fungsi matematik ketepatan arbitrari PHP untuk melaksanakan operasi ketepatan tinggi.
Turut berkongsi penyelesaian pemprosesan berangka biasa, seperti pembundaran, pembundaran, pembundaran jurubank, pemformatan berangka, dsb.
Akhir sekali, mari kita fikirkan apungan MySQL melalui apungan PHP.
Pada masa hadapan, apabila menggunakan pengiraan titik terapung, anda mesti berhati-hati, butiran menentukan kejayaan atau kegagalan.
Pembelajaran yang disyorkan: "Tutorial Video PHP"
Atas ialah kandungan terperinci Adakah operasi titik terapung dalam PHP tepat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!