Rumah > pembangunan bahagian belakang > masalah PHP > Bincangkan masalah nombor titik terapung tidak sama dalam PHP

Bincangkan masalah nombor titik terapung tidak sama dalam PHP

PHPz
Lepaskan: 2023-03-21 15:38:01
asal
1575 orang telah melayarinya

PHP ialah bahasa pengaturcaraan yang popular dan bahasa skrip sebelah pelayan. Dalam PHP, ia mempunyai ciri yang fleksibel dan berkuasa, jadi ia digunakan secara meluas dalam bidang pembangunan web.

Dalam pengaturcaraan PHP, kita sering menghadapi pengiraan nombor titik terapung Walau bagaimanapun, kerana nombor selepas titik perpuluhan nombor titik terapung sukar untuk diwakili dengan tepat, ini akan menyebabkan apabila membandingkan sama ada dua nombor titik terapung. sama. Selalunya mendapat keputusan yang salah.

Mari bincangkan isu nombor titik terapung yang tidak sama dalam PHP.

Ciri-ciri nombor titik terapung

Nombor titik terapung ialah nombor yang digunakan untuk mewakili perpuluhan Ia mempunyai dua elemen: mantissa dan eksponen. Dalam piawaian IEEE 754, nombor titik terapung diwakili dalam binari.

Oleh kerana ketepatan nombor titik terapung akan berubah mengikut saiz nilai, anda perlu memberi perhatian kepada ciri nombor titik terapung semasa melakukan operasi perbandingan.

Contohnya:

$a = 0.1 + 0.2;
$b = 0.3;
echo ($a == $b) ? "Equal" : "Not Equal";
Salin selepas log masuk

Keluaran yang kami jangkakan adalah Sama. Walau bagaimanapun, hasil keluaran sebenar adalah Tidak Sama.

Mengapa ini berlaku? Ini kerana dalam komputer, nombor titik terapung disimpan dalam bentuk binari, jadi 0.1 dan 0.2 ialah perpuluhan berulang yang tidak terhingga apabila ditukar kepada binari, dan komputer hanya boleh menggunakan bilangan digit yang terhad untuk menyimpannya. Oleh itu, apabila komputer menukar 0.1 dan 0.2 kepada perduaan, ia tidak disimpan dengan tepat, dan hasil akhir sedikit padam. Sisihan ini akan terkumpul semasa operasi tambah, menyebabkan keputusan menjadi tidak sama dengan nilai yang dijangkakan.

Cara yang betul untuk membandingkan nombor titik terapung

Dalam PHP, terdapat pelbagai cara untuk membandingkan dua nombor titik terapung untuk kesamaan. Mari perkenalkan kaedah ini di bawah.

Kaedah 1: Gunakan fungsi bulat() untuk menyemak ralat

Fungsi bulat() boleh membundarkan nombor titik terapung kepada nombor digit yang ditentukan. Oleh itu, apabila kita ingin membandingkan dua nombor titik terapung untuk kesamaan, kita boleh terlebih dahulu membundarkannya kepada bilangan tempat perpuluhan yang sama menggunakan fungsi round(), dan kemudian membandingkannya.

Contohnya:

$a = 0.1 + 0.2;
$b = 0.3;
$precision = 14;
if (round($a, $precision) == round($b, $precision)) {
  echo "Equal";
} else {
  echo "Not Equal";
}
Salin selepas log masuk

Dalam contoh di atas, pembolehubah $precision menentukan bilangan tempat perpuluhan yang hendak dibundarkan. Dalam contoh ini, kami menggunakan fungsi round() untuk membundarkan dua nombor kepada 14 tempat perpuluhan dan kemudian membandingkannya untuk mendapatkan hasil yang betul.

Kaedah 2: Gunakan perpustakaan pengiraan tepat

Apabila kita perlu melakukan perbandingan titik terapung yang tepat, kita boleh menggunakan perpustakaan pengiraan tepat yang disediakan oleh PHP. Pustaka ini menyediakan beberapa fungsi yang boleh melakukan pengiraan ketepatan tinggi pada nombor titik terapung, dengan itu mengelakkan ralat yang berlaku dalam operasi nombor titik terapung.

Pustaka pengiraan tepat yang biasa digunakan termasuk perpustakaan BC Math dan GMP. Kedua-dua perpustakaan menyediakan satu siri fungsi yang boleh melaksanakan pelbagai operasi titik terapung berketepatan tinggi, dan keputusan pengiraan adalah sama dengan keputusan sebenar.

Contohnya:

$a = "0.1";
$b = "0.2";
$c = "0.3";
$sum = bcadd($a, $b, 2); // 计算a和b的和
if (bccomp($sum, $c, 2) == 0) { // 比较计算结果和期望结果
  echo "Equal";
} else {
  echo "Not Equal";
}
Salin selepas log masuk

Dalam contoh di atas, kami menggunakan fungsi bcadd() untuk mengira nilai pembolehubah $sum, dan kemudian gunakan fungsi bccom() untuk membandingkan $sum dan $ Sama ada nilai c adalah sama. Fungsi bccomp() mengembalikan 0 untuk kesamaan, 1 untuk $sum lebih besar daripada $c, dan -1 untuk $sum kurang daripada $c.

Kesimpulan

Disebabkan oleh ciri-ciri nombor titik terapung, apabila kita membandingkan nombor titik terapung untuk kesamaan, kita perlu memberi perhatian kepada ralat pengiraan dan tidak boleh hanya menggunakan "==" untuk perbandingan Sebaliknya, kaedah perbandingan lain harus digunakan, seperti pembundaran, pengiraan tepat, dsb. Hanya dengan menguasai kaedah perbandingan yang betul anda boleh mengendalikan operasi nombor titik terapung dengan betul dalam PHP.

Atas ialah kandungan terperinci Bincangkan masalah nombor titik terapung tidak sama dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan