Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah yang perlu saya lakukan jika php tidak dapat mengira nombor titik terapung?

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

藏色散人
藏色散人asal
2021-11-19 09:50:161662semak imbas

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
?>

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);
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);
  bcadd — 将两个高精度数字相加
  bccomp — 比较两个高精度数字,返回-1, 0, 1
  bcp — 将两个高精度数字相除
  bcmod — 求高精度数字余数
  bcmul — 将两个高精度数字相乘
  bcpow — 求高精度数字乘方
  bcpowmod — 求高精度数字乘方求模,数论里非常常用
  bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”
  bcsqrt — 求高精度数字平方根
  bcsub — 将两个高精度数字相减
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!

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