Rumah > pembangunan bahagian belakang > tutorial php > Pemahaman mendalam tentang fenomena perpuluhan titik terapung tidak sama dalam PHP

Pemahaman mendalam tentang fenomena perpuluhan titik terapung tidak sama dalam PHP

WBOY
Lepaskan: 2024-03-08 16:02:02
asal
345 orang telah melayarinya

Pemahaman mendalam tentang fenomena perpuluhan titik terapung tidak sama dalam PHP

PHP ialah bahasa pengaturcaraan yang digunakan secara meluas dalam pembangunan web, di mana pemprosesan nombor titik terapung sentiasa menjadi isu yang perlu diberi perhatian oleh pembangun. Dalam perkembangan sebenar, kita sering menghadapi fenomena bahawa nombor titik terapung tidak sama, yang selalunya disebabkan oleh kehilangan ketepatan yang disebabkan oleh bentuk binari nombor titik terapung dalam komputer. Dalam artikel ini, kami akan menyelami ketaksamaan titik terapung dalam PHP dan menggambarkannya dengan contoh kod konkrit.

Pertama, mari kita mulakan dengan contoh mudah. Katakan kita mempunyai dua nombor titik terapung $a = 0.1 + 0.2$ dan $b = 0.3$ Kami menjangkakan bahawa kedua-dua nombor ini sepatutnya sama, tetapi dalam pengaturcaraan sebenar, mereka mungkin tidak sama. Mari kita sahkan dengan kod berikut:

$a = 0.1 + 0.2;
$b = 0.3;

if ($a == $b) {
    echo "相等";
} else {
    echo "不相等";
}
Salin selepas log masuk

Jalankan kod di atas, kita akan dapati bahawa hasil output adalah "tidak sama". Ini kerana dalam komputer, nombor 0.1, 0.2 dan 0.3 adalah perpuluhan berulang yang tidak terhingga apabila diwakili dalam binari, jadi ia tidak boleh diwakili dengan tepat sepenuhnya. Ralat sedikit berlaku semasa mengira $a = 0.1 + 0.2$, menyebabkan nilai $a$ sebenarnya adalah nombor yang sangat hampir dengan 0.3 tetapi tidak betul-betul sama dengan 0.3.

Untuk memahami isu ini dengan lebih mendalam, mari lihat contoh lain. Pertimbangkan kod berikut:

$x = 0.7;
$y = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
if ($x == $y) {
    echo "相等";
} else {
    echo "不相等";
}
Salin selepas log masuk

Menjalankan kod di atas, kita akan mendapati bahawa hasil output adalah "tidak sama". Ini kerana atas sebab yang sama, 0.1 tidak boleh diwakili tepat dalam komputer, dan $y$ sebenarnya adalah nombor yang lebih besar sedikit daripada 0.7. Jadi, walaupun kami menjangkakan bahawa nilai $x$ dan $y$ sepatutnya sama, ia sebenarnya tidak sama disebabkan oleh pengehadan dalam ketepatan titik terapung.

Untuk menyelesaikan masalah ini, kami biasanya menggunakan julat ralat untuk perbandingan titik terapung dan bukannya menggunakan pengendali kesamaan secara langsung. Contohnya, kita boleh mengubah suai kod di atas seperti berikut:

$x = 0.7;
$y = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
$epsilon = 0.00001; // 定义一个误差范围

if (abs($x - $y) < $epsilon) {
    echo "相等";
} else {
    echo "不相等";
}
Salin selepas log masuk

Dengan memperkenalkan julat ralat yang dibenarkan, kita boleh melakukan perbandingan titik terapung dengan lebih fleksibel, dengan itu mengelakkan ketidaksamaan yang disebabkan oleh isu ketepatan.

Ringkasnya, fenomena nombor titik terapung yang tidak sama adalah masalah biasa dalam PHP Disebabkan kehilangan ketepatan akibat perwakilan binari nombor titik terapung, pembangun perlu memberi perhatian untuk mengendalikan situasi ini. Dengan menetapkan julat ralat secara munasabah atau menggunakan kaedah pemprosesan lain, masalah perbandingan tidak sama rata nombor titik terapung boleh diselesaikan dengan berkesan untuk memastikan ketepatan dan kestabilan program.

Atas ialah kandungan terperinci Pemahaman mendalam tentang fenomena perpuluhan titik terapung tidak sama dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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