當(dāng)前位置:博客首頁>>PHP >> 閱讀正文

php hexdec超大數(shù)值的16進(jìn)制轉(zhuǎn)10進(jìn)制

作者: 鄭曉 分類: PHP 發(fā)布于: 2019-06-24 18:50 瀏覽:7,337 沒有評論


使用php內(nèi)置的hexdec函數(shù)在把超大的十六進(jìn)制轉(zhuǎn)換到十進(jìn)制整型表示時,結(jié)果值如果超出平臺整型的最大值時,可能會丟失精度,比如

0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF

在Python中,使用

int(‘FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF’, 16)

計算結(jié)果是

115792089210356248756420345214020892766250353991924191454421193933289684991999

而在PHP中,默認(rèn)使用內(nèi)置函數(shù)hexdec,轉(zhuǎn)為十進(jìn)制的結(jié)果是:

float(1.1579208921036E+77)

即使使用ini_set設(shè)置超長precision,結(jié)果也是不可信的,比如可能得到:

float(115792089210356248756420345214020892766250353992003419616917011526809519390720)

解決:

一、php手冊中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擴展:

$num = gmp_init('FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF');echo gmp_strval($num, 10);


? ? ? ?

本文采用知識共享署名-非商業(yè)性使用 3.0 中國大陸許可協(xié)議進(jìn)行許可,轉(zhuǎn)載時請注明出處及相應(yīng)鏈接。

本文永久鏈接: http://www.yjfs.org.cn/php-large-values-hexdec.html

發(fā)表評論

change vcode