Nombor titik terapung memainkan peranan yang sangat penting dalam pengaturcaraan, dan diperlukan dalam banyak bidang termasuk pengiraan ekonomi, rakaman data, simulasi fizikal, dsb. Walau bagaimanapun, beberapa masalah mungkin timbul apabila melibatkan pengiraan titik terapung disebabkan oleh mekanisme penyimpanan dan pemprosesan komputer. Artikel ini akan memperkenalkan penukaran nombor titik terapung, isu ketepatan, penyelesaian dan amalan terbaik dalam PHP.
1. Perwakilan nombor titik terapung
Dalam komputer, nombor titik terapung terdiri daripada perpuluhan dan eksponen, dan biasanya dinyatakan dalam tatatanda saintifik.
Contohnya: 1.234e+4 bermaksud 1.234 kali 10 dinaikkan kepada kuasa keempat. Nombor ini dibahagikan kepada dua bahagian:
Dalam PHP, nombor titik terapung Ia dinyatakan dalam 64- format bit IEEE-754 dan mempunyai komponen berikut:
2. Masalah penukaran titik terapung dalam PHP
Dalam PHP, tiada masalah dalam melaksanakan operasi tambah, tolak, darab dan bahagi yang mudah pada nombor titik terapung, tetapi apabila melakukan pengiraan yang rumit, ralat boleh berlaku dengan mudah.
Contohnya:
$a = 0.1; $b = 0.2; $c = $a + $b; echo $c; //0.3 if ($c == 0.3) { echo 'true'; } else { echo 'false'; }
Apabila melaksanakan kod ini, output hasil adalah palsu Ini kerana cara nombor titik terapung disimpan dalam komputer adalah berbeza daripada perwakilan perpuluhan, dan terdapat masalah ketepatan.
Apabila menukar nombor titik terapung kepada rentetan, kegagalan penukaran juga mungkin berlaku.
Contohnya:
$val = 0.0000005; $str = (string)$val; echo $str; //5.0E-7
Rentetan ini jelas sekali tidak ditukar mengikut cara yang kita jangkakan Ini kerana nombor titik terapung menggunakan tatatanda saintifik, jadi tatatanda saintifik juga digunakan semasa menukar kepada a rentetan.
3. Penyelesaian penukaran titik terapung dan amalan terbaik dalam PHP
dalam Apabila membandingkan terapung nombor titik, kita tidak seharusnya menggunakan operator kesamaan (==) secara langsung, tetapi boleh menggunakan penyelesaian berikut:
$a = 0.1; $b = 0.2; $c = $a + $b; $epsilon = 0.00001;//可以酌情调整 if(abs($c - 0.3) < $epsilon) { echo 'true'; } else { echo 'false'; }
Di sini kami menetapkan julat ralat $epsilon, apabila mengira nilai mutlak hasil Apabila perbezaan daripada hasil yang dijangkakan adalah kurang daripada $epsilon, kedua-dua nombor itu dinilai sama.
Apabila kita perlu menukar nombor titik terapung kepada rentetan, kita boleh menggunakan fungsi sprintf untuk memformat output.
Contohnya:
$val = 0.0000005; $str = sprintf("%.10f", $val); echo $str; //0.0000005000
%.10f dalam fungsi sprintf bermaksud mengeluarkan 10 digit selepas titik perpuluhan Maksud asal %f ialah "nombor titik terapung", ditambah dengan yang berikut titik perpuluhan Nombor 10 mewakili bilangan titik perpuluhan yang akan dikekalkan dalam nombor titik terapung.
Jika anda memerlukan pengiraan ketepatan tinggi, anda boleh menggunakan perpustakaan fungsi matematik BC. Pustaka ini menyediakan fungsi yang menyokong operasi data berketepatan tinggi, yang boleh mengelakkan ralat ketepatan dalam pengiraan titik terapung.
Contohnya:
$a = '0.1'; $b = '0.2'; $c = bcadd($a, $b, 3); echo $c; //0.300
Kaedah ini memerlukan perpustakaan fungsi matematik BC diperkenalkan secara eksplisit dalam kod, dan ia juga perlu dipanggil mengikut spesifikasi fungsi perpustakaan apabila digunakan.
4. Ringkasan
Melalui artikel ini, kami telah mengetahui tentang masalah dan penyelesaian biasa yang mungkin berlaku apabila menukar nombor titik terapung dalam PHP. Walaupun terdapat masalah ketepatan dalam pengiraan titik terapung asas PHP, kami boleh menyelesaikan masalah ini melalui beberapa teknik dan fungsi perpustakaan untuk menyediakan sokongan pengiraan berangka yang lebih dipercayai untuk pelaksanaan projek.
Atas ialah kandungan terperinci Mari bercakap tentang masalah biasa dalam penukaran nombor titik terapung dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!