Apakah yang perlu saya lakukan jika php tidak dapat mengira nombor titik terapung?

藏色散人
Lepaskan: 2023-03-13 22:12:02
asal
1625 orang telah melayarinya

PHP tidak boleh mengira nombor titik terapung kerana perduaan asas komputer tidak dapat mewakili nombor titik terapung dengan tepat Penyelesaiannya ialah menggunakan perpustakaan kelas atau perpustakaan fungsi untuk pengiraan yang tepat, seperti perpustakaan fungsi ketepatan tinggi BC. dalam PHP.

Apakah yang perlu saya lakukan jika php tidak dapat mengira nombor titik terapung?

Persekitaran pengendalian artikel ini: sistem Windows 7, PHP versi 7.1, komputer DELL G3

Apakah yang perlu saya lakukan jika php tidak boleh mengira nombor titik terapung?

Masalah dengan pengiraan nombor titik terapung dalam php

Jika anda menggunakan php's -*/ untuk mengira nombor titik terapung, anda mungkin menghadapi beberapa masalah dengan pengiraan yang salah hasil. , sebagai contoh, echo intval(0.58*100); menggunakan python. Jadi pada asasnya kebanyakan bahasa menyediakan perpustakaan kelas atau perpustakaan fungsi untuk pengiraan yang tepat Contohnya, PHP mempunyai pustaka fungsi ketepatan tinggi BC Berikut ialah beberapa fungsi ketepatan tinggi BC yang biasa digunakan.

Contoh

<?php    
$f = 0.58;    
var_dump(intval($f * 100)); 
//为啥输出57
?>
Salin selepas log masuk

Mengapa keluaran 57 Adakah ia pepijat dalam PHP

Saya percaya ramai pelajar mempunyai soalan ini, kerana hanya bertanya kepada saya Ada? ramai orang yang mempunyai soalan yang sama, apatah lagi orang sering bertanya di bugs.php.net...

Untuk memahami sebab ini, pertama kita perlu mengetahui perwakilan nombor titik terapung (IEEE 754):

Nombor titik terapung, mengambil panjang 64-bit (kepersisan berganda) sebagai contoh, akan diwakili oleh 1 bit tanda (E), 11 bit eksponen (Q) dan 52-bit mantissa (M) (a jumlah 64 bit).

Bit tanda: Bit tertinggi mewakili tanda data, 0 mewakili nombor positif, dan 1 mewakili nombor negatif.

Bit eksponen: mewakili kuasa data dengan asas 2, dan eksponen diwakili oleh kod offset

Mantissa: mewakili digit bererti selepas titik perpuluhan data >

Perkara utama di sini Ia terletak pada perwakilan perpuluhan dalam perduaan Mengenai bagaimana untuk mewakili perpuluhan dalam perduaan, anda boleh mencari di Baidu Saya tidak akan pergi ke butiran di sini perwakilan binari, 0.58 ialah nilai tak terhingga (nombor di bawah Meninggalkan 1 tersirat)..

Perwakilan binari 0.58 (52 bit) pada asasnya: 00101000111101011000010100011110101101010 perwakilan (52 bit) ialah: 00100011110 1011100001010001111010111000010100011110 Dan perduaan kedua-duanya, jika lulus sahaja Untuk pengiraan 52 bit ini, ia adalah: www.111cn.net

 0.58 -> * 100, kami tidak mengambil kira butiran itu, jika anda berminat Anda boleh lihat (Titik terapung), mari kita lihat secara kabur dengan aritmetik mental... 0.58 * 100 = 57.999999999

Kemudian jika anda intval, ia secara semula jadi akan menjadi 57...

Dapat dilihat bahawa kunci kepada masalah ini Intinya ialah: "Perpuluhan anda yang kelihatan terhingga sebenarnya tidak terhingga dalam perwakilan binari komputer"

Jadi, jangan anggap ini pepijat PHP lagi, inilah dia...

Jenis titik terapung PHP mempunyai ketidaktepatan dalam -*%/

Contohnya:

  $a = 0.1;
  $b = 0.7;
  var_dump(($a + $b) == 0.8);
Salin selepas log masuk
Nilai yang dicetak adalah boolean false

This Why?

Jelas pecahan perpuluhan mudah seperti 0.1 atau 0.7 tidak boleh digunakan tanpa kehilangan satu Tukar kepada format binari dalaman dengan ketepatan titik. Ini boleh membawa kepada hasil yang mengelirukan: contohnya, floor((0.1 0.7)*10) biasanya akan mengembalikan 7 dan bukannya 8 yang dijangkakan, kerana perwakilan dalaman hasil adalah seperti 7.9999999999….

Ini berkaitan dengan fakta bahawa adalah mustahil untuk menyatakan pecahan perpuluhan tertentu dengan tepat dengan nombor terhingga digit. Sebagai contoh, 1/3 dalam perpuluhan menjadi 0.3333333 .

Jadi jangan sekali-kali percaya bahawa hasil nombor titik terapung adalah tepat kepada digit terakhir, dan jangan sekali-kali membandingkan sama ada dua nombor titik terapung adalah sama. Jika anda benar-benar memerlukan ketepatan yang lebih tinggi, anda harus menggunakan fungsi matematik ketepatan arbitrari atau fungsi gmp

Kodnya adalah seperti berikut:

 Disusun beberapa contoh

php BC Pustaka fungsi berketepatan tinggi termasuk: penambahan, perbandingan, pembahagian, penolakan, baki, pendaraban, kuasa ke-n, mengkonfigurasi nombor lalai titik perpuluhan dan kuasa dua. Fungsi ini lebih berguna apabila melibatkan pengiraan monetari, seperti pengiraan harga e-dagang.
<?php
$a = 0.1;
$b = 0.7;
var_dump(bcadd($a,$b,2) == 0.8);
Salin selepas log masuk
  bcadd — 将两个高精度数字相加
  bccomp — 比较两个高精度数字,返回-1, 0, 1
  bcp — 将两个高精度数字相除
  bcmod — 求高精度数字余数
  bcmul — 将两个高精度数字相乘
  bcpow — 求高精度数字乘方
  bcpowmod — 求高精度数字乘方求模,数论里非常常用
  bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”
  bcsqrt — 求高精度数字平方根
  bcsub — 将两个高精度数字相减
Salin selepas log masuk
Nota: Mengenai bilangan digit yang ditetapkan, lebihan dibuang dan bukannya dibundarkan.

Pembelajaran yang disyorkan: "

Tutorial Video PHP

"

Atas ialah kandungan terperinci Apakah yang perlu saya lakukan jika php tidak dapat mengira nombor titik terapung?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!