做(zuò)自(zì)由與創造的先行(xíng)者

Float 浮點型

PHP中文手冊

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

$a = 1.234;

$b = 1.2e3;

$c = 7E-10;

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

?>

浮點數(shù)的形式表示(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})

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

警告

浮點數(shù)的精度

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

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

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

參見(jiàn)» 浮點數(shù)指南網頁的簡單解釋。

轉換為(wèi)浮點數(shù) ¶

從(cóng) string 轉換 ¶

如(rú)果 string 是 numeric 或者前導數(shù)字, 則将它解析為(wèi)相應的 float 值,否則将轉換為(wèi)零(0)。

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

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

注意:

某些類型在轉換成 int 時(shí)有未定義行(xíng)為(wèi),轉換為(wèi) float 時(shí)也會如(rú)此。

比較浮點數(shù) ¶

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

要(yào)測試浮點數(shù)是否相等,要(yào)使用一(yī)個僅比該數(shù)值大一(yī)丁點的最小誤差值。該值也被稱為(wèi)機器極小值(epsilon)或最小單元取整數(shù),是計算中所能(néng)接受的最小的差别值。

$a 和(hé) $b 在小數(shù)點後五位精度內(nèi)都(dōu)是相等的。

<?php

$a = 1.23456789;

$b = 1.23456780;

$epsilon = 0.00001;

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

echo "true";

}

?>

NaN ¶

某些數(shù)學運算會産生一(yī)個由常量 NAN 所代表的結果。此結果代表着一(yī)個在浮點數(shù)運算中未定義或不可(kě)表述的值。任何拿(ná)此值與其它任何值(除了(le) true)進行(xíng)的松散或嚴格比較的結果都(dōu)是 false。

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

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