php hexdec超大數(shù)值的16進(jìn)制轉(zhuǎn)10進(jìn)制
作者: 鄭曉 分類: PHP 發(fā)布于: 2019-06-24 18:50 瀏覽:7,556 沒有評(píng)論
使用php內(nèi)置的hexdec函數(shù)在把超大的十六進(jìn)制轉(zhuǎn)換到十進(jìn)制整型表示時(shí),結(jié)果值如果超出平臺(tái)整型的最大值時(shí),可能會(huì)丟失精度,比如
0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
在Python中,使用
int(‘FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF’, 16)
計(jì)算結(jié)果是
115792089210356248756420345214020892766250353991924191454421193933289684991999
而在PHP中,默認(rèn)使用內(nèi)置函數(shù)hexdec,轉(zhuǎn)為十進(jìn)制的結(jié)果是:
float(1.1579208921036E+77)
即使使用ini_set設(shè)置超長(zhǎng)precision,結(jié)果也是不可信的,比如可能得到:
float(115792089210356248756420345214020892766250353992003419616917011526809519390720)
解決:
一、php手冊(cè)中hexdec的注釋中的方法:
function bchexdec($hex){ $dec = 0; $len = strlen($hex); for ($i = 1; $i <= $len; $i++) { $dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i)))); } return $dec;}
二、或使用 gmp擴(kuò)展:
$num = gmp_init('FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF');echo gmp_strval($num, 10);
本文采用知識(shí)共享署名-非商業(yè)性使用 3.0 中國大陸許可協(xié)議進(jìn)行許可,轉(zhuǎn)載時(shí)請(qǐng)注明出處及相應(yīng)鏈接。
本文永久鏈接: http://yjfs.org.cn/php-large-values-hexdec.html