鍍金池/ 問(wèn)答/PHP  HTML/ PHP與JS大數(shù)字計(jì)算差異

PHP與JS大數(shù)字計(jì)算差異

同一個(gè)算法,在計(jì)算大數(shù)字時(shí),PHP和JS計(jì)算的結(jié)果完全不同。
JS代碼不是我寫的,我想用PHP實(shí)現(xiàn)JS代碼里的算法。奇怪的是,前3次計(jì)算是一致的,后面就不一樣了。

代碼&運(yùn)行結(jié)果如下:


PHP代碼:

$token = '123456789';
$t = 5381;
for ($n = 0, $r = strlen($token); $n < $r; ++$n) {
    $t = bcadd($t, bcadd(($t << 5), ord($token{$n})));
    echo $t, "\n";
}

$result = $t & 2147483647;

echo $result;

PHP已用bcadd函數(shù)進(jìn)行大數(shù)字計(jì)算處理。

PHP輸出:

177622
5861576
193432059
6383257999
210647514020
6951367962714
229395142769617
7570039711397417
249811310476114818
902675330

JS代碼:

var e = '123456789';

var t = 5381;
for (var n = 0, r = e.length; n < r; ++n) {
    t += (t << 5) + e.charCodeAt(n);
    console.log(t);
}
var val = t & 2147483647;

console.log(val);

JS輸出:

177622
5861576
193432059
2088290703
194116516
2110877786
939490257
938407465
902675330
902675330

我想知道PHP和JS在數(shù)字計(jì)算時(shí),哪兒的差異導(dǎo)致最后計(jì)算的結(jié)果不同。
請(qǐng)問(wèn)PHP該如何實(shí)現(xiàn)JS代碼里那種算法。
謝謝諸路大神賜教~

回答
編輯回答
夏木

代碼亂七八糟的。

js 里沒(méi)有大數(shù)字。超過(guò) 整數(shù)就是浮點(diǎn)數(shù)。浮點(diǎn)不精確。

php有bcmath,你要算就全用 bcmath 來(lái)算,中間有個(gè)整數(shù)與&,和位移<<,是怎么回事?

2017年6月16日 20:04