Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mari bercakap tentang masalah biasa dalam penukaran nombor titik terapung dalam PHP

Mari bercakap tentang masalah biasa dalam penukaran nombor titik terapung dalam PHP

PHPz
PHPzasal
2023-03-23 14:10:591501semak imbas

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:

  • Pekali: 1.234
  • Eksponen: 4

Dalam PHP, nombor titik terapung Ia dinyatakan dalam 64- format bit IEEE-754 dan mempunyai komponen berikut:

  1. Bit tanda: Bit pertama mewakili positif dan negatif, 0 ialah nombor positif dan 1 ialah nombor negatif.
  2. Bit eksponen: 11 bit tengah mewakili eksponen, menggunakan kaedah perwakilan kod eksponen. Julat nilai ialah -1022 ~ 1023, yang diimbangi oleh 1023, jadi nilai dalam pengekodan ialah nilai sebenar + 1023.
  3. Bit mantissa: Baki 52 bit mewakili mantissa, menggunakan tatatanda perpuluhan binari.

2. Masalah penukaran titik terapung dalam PHP

  1. Ralat berlaku semasa menjalankan operasi titik terapung mudah

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.

  1. Gagal menukar nombor titik terapung kepada rentetan

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

  1. Gunakan operator perbandingan untuk membandingkan

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.

  1. Gunakan fungsi sprintf untuk memformat output

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.

  1. Gunakan perpustakaan fungsi matematik BC

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!

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