php中浮点型的精确度,PHP中的浮点精度和类型
PHP中的浮點數(shù)
PHP浮點數(shù)精度
在PHP中,浮點數(shù)的字長和平臺相關(guān),通常最大值是 1.8e308 并具有 14 位十進制數(shù)字的精度(64 位 IEEE 格式)。
浮點數(shù)的精度有限。盡管取決于系統(tǒng),PHP 通常使用 IEEE 754 雙精度格式,則由于取整而導(dǎo)致的最大相對誤差為 1.11e-16。非基本數(shù)學(xué)運算可能會給出更大誤差,并且要考慮到進行復(fù)合運算時的誤差傳遞。
此外,以十進制能夠精確表示的有理數(shù)如 0.1 或 0.7,無論有多少尾數(shù)都不能被內(nèi)部所使用的二進制精確表示,因此不能在不丟失一點點精度的情況下轉(zhuǎn)換為二進制的格式。
floor((0.1+0.7)*10) 通常會返回 7 而不是預(yù)期中的 8,因為該結(jié)果內(nèi)部的表示其實是類似 7.9999999999999991118…
所以永遠不要相信浮點數(shù)結(jié)果精確到了最后一位,也永遠不要比較兩個浮點數(shù)是否相等。
PHP浮點數(shù)比較
由于浮點數(shù)內(nèi)部表示導(dǎo)致的精度缺失問題,所以比較浮點數(shù)是不能使用相等,而要判斷比較的數(shù)值之間的差值是否在某個最下誤差范圍內(nèi)。
這個最下誤差也被稱為機器極小值(epsilon)或最小單元取整數(shù),是計算中所能接受的最小的差別值。
NaN
某些數(shù)學(xué)運算會產(chǎn)生一個由常量 NAN 所代表的結(jié)果。此結(jié)果代表著一個在浮點數(shù)運算中未定義或不可表述的值。任何拿此值與其它任何值進行的松散或嚴格比較的結(jié)果都是 FALSE。
由于 NAN 代表著任何不同值,不應(yīng)拿 NAN 去和其它值進行比較,包括其自身,應(yīng)該用 is_nan() 來檢查。
PHP中數(shù)值的近似
在PHP中,經(jīng)常會遇到對浮點數(shù)進行四舍五入,下面列出一些常用的PHP中的精度取舍函數(shù)。
float ceil ( float value ):對value向上取整(舍去小數(shù)部分并加1)
float floor ( float value ):對value向下取整(舍去小數(shù)部分)
float round ( float val [, int precision] ):將 val 根據(jù)指定精度 precision(十進制小數(shù)點后數(shù)字的數(shù)目)進行四舍五入
string sprintf ( string format [, mixedargs [, mixed $… ]] ):格式化字符串
PHP中強制類型轉(zhuǎn)換
使用類型提示符
這種方式通過在需要轉(zhuǎn)換類型的變量前加上類型提示符,如下:
(int) :轉(zhuǎn)換為整形
(bool) :轉(zhuǎn)換為布爾型
(float) :轉(zhuǎn)換為浮點型
(string) :轉(zhuǎn)換為字符串
(array) :轉(zhuǎn)換為數(shù)組
(object) :轉(zhuǎn)換為對象
使用類型轉(zhuǎn)換函數(shù)
PHP中提供了類似 intval(),floatval() 系列的類型轉(zhuǎn)換函數(shù):
intval() :轉(zhuǎn)換為整形
boolval() :轉(zhuǎn)換為布爾型
floatval() :轉(zhuǎn)換為浮點型
strval() : 轉(zhuǎn)換為字符串
使用settype()
settype函數(shù)的聲明為:bool settype ( mixed &var , stringtype ),用于設(shè)置變量的類型。type可以為:
“boolean” 或者 “bool”
“integer” 或者 “int”
“float” 或者 “double”
“string”
“array”
“object”
“null”
當(dāng)改變類型成功后返回true,否則返回false
PHP中的類型判斷
和 settype() 對于,可以使用gettype()函數(shù)來獲取變量的類型:string gettype ( mixed $var ),返回值可能為:
“boolean”(從 PHP 4 起)
“integer”
“double” (由于歷史原因,如果是 float 則返回“double”,而不是“float”)
“string”
“array”
“object”
“resource”(從 PHP 4 起)
“resource (closed)” (PHP 7.2.0添加)
“NULL”
“user function”(只用于 PHP 3,現(xiàn)已停用)
“unknown type”
對于 function 類型的變量,使用 function_exists() 和 method_exists() 來進行判斷。
另外PHP中還有一系列類似 is_array() 系列的: bool is_TYPE(mixed $var) 函數(shù)可以判斷類型,它們都接受一個變量參數(shù),如果是指定類型,則返回true,否則返回false,如下:
is_bool(): 檢測變量是否為布爾類型
is_string(): 檢測變量是否為字符串
is_int(): 檢測變量是否為整形
is_float(): 檢測變量是否為浮點型
is_null(): 檢測變量是否為空NULL
is_numeric(): 檢測變量是否為數(shù)字或數(shù)字字符串
is_array(): 檢測變量是否為數(shù)組
is_callable(): 檢測變量是可以作為函數(shù)調(diào)用
is_object(): 檢測變量是否為對象
is_resource(): 檢測變量是否為資源類型
is_scalar(): 檢測變量是否是一個標(biāo)量
由于 gettype() 函數(shù)涉及到字符串比較,所以一般推薦使用 is_TYPE() 系列函數(shù)更加快速。
最后對于 object 對象,可以使用 get_class() 函數(shù)返回對象的類名,返回的類名包含完整的命名空間。
總結(jié)
以上是生活随笔為你收集整理的php中浮点型的精确度,PHP中的浮点精度和类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 投浆水的面汤里有菠菜汤可以继续投浆水吗?
- 下一篇: 如何做一份营养均衡的午餐?