做自(zì)由與創造的先行者

Float 浮點型

PHP中文(wén)手冊

浮點型(也(yě)叫浮點數 float,雙精度數 double 或實數 real)可以用(yòng)以下(xià)任一語法定義:

$a = 1.234;

$b = 1.2e3;

$c = 7E-10;

$d = 1_234.567; // 從(cóng) PHP 7.4.0 開(kāi)始支持

?>

浮點數的形式表示(PHP 7.4.0 之前不支持下(xià)劃線):

LNUM [0-9]+(_[0-9]+)*

DNUM ([0-9]*(_[0-9]+)*[\.]{LNUM}) | ({LNUM}[\.][0-9]*(_[0-9]+)*)

EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})

浮點數的字長和(hé)平台相關,盡管通常最大(dà)值是 1.8e308 并具有 14 位十進制數字的精度(64 位 IEEE 格式)。

警告

浮點數的精度

浮點數的精度有限。盡管取決于系統,PHP 通常使用(yòng) IEEE 754 雙精度格式,則由于取整而導緻的最大(dà)相對(duì)誤差爲 1.11e-16。非基本數學運算(suàn)可能(néng)會(huì)給出更大(dà)誤差,并且要考慮到(dào)進行複合運算(suàn)時(shí)的誤差傳遞。

此外(wài),以十進制能(néng)夠精确表示的有理(lǐ)數如 0.1 或 0.7,無論有多少尾數都不能(néng)被内部所使用(yòng)的二進制精确表示,因此不能(néng)在不丢失一點點精度的情況下(xià)轉換爲二進制的格式。這(zhè)就會(huì)造成混亂的結果:例如,floor((0.1+0.7)*10) 通常會(huì)返回 7 而不是預期中的 8,因爲該結果内部的表示其實是類似 7.9999999999999991118...。

所以永遠不要相信浮點數結果精确到(dào)了(le)最後一位,也(yě)永遠不要比較兩個浮點數是否相等。如果确實需要更高(gāo)的精度,應該使用(yòng)任意精度數學函數或者 gmp 函數。

參見» 浮點數指南網頁的簡單解釋。

轉換爲浮點數 ¶

從(cóng) string 轉換 ¶

如果 string 是 numeric 或者前導數字, 則将它解析爲相應的 float 值,否則将轉換爲零(0)。

從(cóng)其他(tā)類型轉換 ¶

對(duì)于其它類型的值,其情況類似于先将值轉換成 int,然後再轉換成 float。 請(qǐng)參閱“轉換爲整型”一節以獲取更多信息。

注意:

某些(xiē)類型在轉換成 int 時(shí)有未定義行爲,轉換爲 float 時(shí)也(yě)會(huì)如此。

比較浮點數 ¶

如上(shàng)述警告信息所言,由于内部表達方式的原因,比較兩個浮點數是否相等是有問題的。不過還是有迂回的方法來(lái)比較浮點數值的。

要測試浮點數是否相等,要使用(yòng)一個僅比該數值大(dà)一丁點的最小(xiǎo)誤差值。該值也(yě)被稱爲機器極小(xiǎo)值(epsilon)或最小(xiǎo)單元取整數,是計(jì)算(suàn)中所能(néng)接受的最小(xiǎo)的差别值。

$a 和(hé) $b 在小(xiǎo)數點後五位精度内都是相等的。

<?php

$a = 1.23456789;

$b = 1.23456780;

$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {

echo "true";

}

?>

NaN ¶

某些(xiē)數學運算(suàn)會(huì)産生一個由常量 NAN 所代表的結果。此結果代表着一個在浮點數運算(suàn)中未定義或不可表述的值。任何拿此值與其它任何值(除了(le) true)進行的松散或嚴格比較的結果都是 false。

由于 NAN 代表着任何不同值,不應拿 NAN 去和(hé)其它值進行比較,包括其自(zì)身,應該用(yòng) is_nan() 來(lái)檢查。

網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發
下(xià)一篇:String 字符串
上(shàng)一篇:Integer 整型