Rumah  >  Artikel  >  php教程  >  Penyelesaian untuk pengiraan titik terapung yang tidak tepat, perbandingan dan pembundaran dalam asas PHP_php

Penyelesaian untuk pengiraan titik terapung yang tidak tepat, perbandingan dan pembundaran dalam asas PHP_php

WBOY
WBOYasal
2016-05-16 09:00:002155semak imbas

Perbandingan hasil pengiraan titik terapung
Contoh pengiraan titik terapung adalah seperti berikut:

Salin kod Kod adalah seperti berikut:

$a = 0.2+0.7;
$b = 0.9;
var_dump($a == $b);

Hasil cetakan ialah: bool(false). Dalam erti kata lain, hasil pengiraan 0.2+0.7 di sini tidak sama dengan 0.9, yang jelas bertentangan dengan akal fikiran kita.

Mengenai isu ini, manual PHP rasmi pernah menyatakan: Nampaknya pecahan perpuluhan mudah seperti 0.2 tidak boleh ditukar kepada format binari dalaman tanpa kehilangan sedikit ketepatan. Ini ada kaitan dengan hakikat bahawa adalah mustahil untuk menyatakan pecahan perpuluhan tertentu dengan tepat dengan bilangan digit terhingga. Sebagai contoh, 1/3 dalam perpuluhan menjadi 0.3333333….

Kami mencetak pembolehubah di atas dalam format ketepatan dua kali:

Salin kod Kod adalah seperti berikut:

$a = 0.2+0.7;
$b = 0.9;
printf("%0.20f", $a);
echo '
';
printf("%0.20f", $b);

Hasil keluaran adalah seperti berikut:

Salin kod Kod adalah seperti berikut:

0.89999999999999991118
0.9000000000000002220

Jelas sekali di sini, sebagai data titik terapung, sebahagian daripada ketepatannya telah hilang dan tidak boleh tepat sepenuhnya. Oleh itu, jangan sekali-kali percaya bahawa hasil nombor titik terapung adalah tepat kepada digit terakhir, dan jangan sekali-kali membandingkan dua nombor titik terapung untuk kesamaan. Perlu diingatkan bahawa ini bukan masalah dengan PHP, tetapi masalah dengan pemprosesan dalaman komputer nombor titik terapung! Masalah yang sama akan dihadapi dalam bahasa seperti C dan JAVA.

Jadi untuk membandingkan dua nombor titik terapung, kita perlu mengawalnya dalam julat ketepatan yang kita perlukan sebelum membandingkan, jadi gunakan fungsi bcadd() untuk menambah nombor titik terapung dan tukar ketepatan (kepada rentetan):

Salin kod Kod adalah seperti berikut:

var_dump(bcadd(0.2,0.7,1) == 0.9); // Output: bool(true)

Pembundaran nombor titik terapung

Dalam artikel "Sisi dan lantai fungsi pembulatan PHP", terdapat contoh:

Salin kod Kod adalah seperti berikut:

echo ceil(2.1/0.7); // Output: 4
?>

Selepas perbincangan di atas tentang pengiraan nombor titik terapung, kami tahu bahawa ini disebabkan oleh keputusan pengiraan nombor titik terapung yang tidak tepat:

Salin kod Kod adalah seperti berikut:

printf("%0.20f", (2.1/0.7)); // Output: 3.0000000000000044409
?>

Selepas perbincangan di atas tentang pengiraan nombor titik terapung, kami tahu bahawa ini disebabkan oleh hasil pengiraan nombor titik terapung yang tidak tepat, jadi kami boleh menggunakan fungsi pusingan() untuk menanganinya:

Salin kod Kod adalah seperti berikut:

siling gema( bulat((2.1/0.7),1) );
?>

Walaupun fungsi bulat() membulat mengikut ketepatan yang ditentukan, mengekalkan satu tempat perpuluhan tidak mempunyai kesan pada hasil pembundaran kami.

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