PHP Büyük sayılar ile çalışma

7 Cevap php

(100.000 +) büyük sayılarla Fermat Primality Test kullanırken gerektirecek gibi modular exponentiation kullanmak için, bazı çok büyük hesaplamalar için çağırır.

Ben iki büyük sayıda (örneğin: 62574 ve 62574) çarpın PHP bir float sonucu döküm gibi görünüyor. Bunun modülü değerini alma garip değerleri döndürür.

$x = 62574 * 62574;
var_dump($x);          // float(3915505476) ... correct
var_dump($x % 104659); // int(-72945)  ... wtf.

PHP doğru bu hesaplamalar yapmak için herhangi bir yolu var mı? Alternatif olarak, büyük sayılar için işe modül değerleri bulmak için başka bir yöntem var mı?

7 Cevap

BC Math ve GMP: Nedense, keyfi uzunluğu / hassas numaralarını ele PHP iki standart kütüphaneler bulunmaktadır. Daha taze olduğunu ve zengin bir API var gibi ben şahsen, GMP tercih ederim.

GMP dayanarak ben Decimal2 class (USD 100.25 gibi) para miktarlarda depolanması ve işlenmesi için uygulanan ettik. A lot mod hesaplamalar orada w / o herhangi bir sorun. very büyük sayılar ile test edilmiştir.

(Bir dizge olarak) bir değişken içine çok sayıda koymak için sprintf:

$big = 1000000000000000000;
$myvar = sprintf('%.0f', $big);

Bu kullanabilirsiniz

 $num1 = "123456789012345678901234567890";
 $num2 = "9876543210";
 $r    = mysql_query("Select @sum:=$num1 + $num2");
 $sumR = mysql_fetch_row($r);
 $sum  = $sumR[0];

Sana BigInteger denemenizi öneririz. Bu işe yaramazsa, sen SWIG büyük tamsayı hesaplamalar için C / C + + kodu eklemek ve koduna bağlamak için kullanabilirsiniz.

Ben başka bir çözüm bulundu:

function terminal_add($a, $b){
    return (int) shell_exec('echo "'.$a.'+'.$b.'"|bc');
}

// terminal_add(123456789012345678901234567890,9876543210)
// output: 123456789012345678911111111100

Hiç denediniz mi

bcmod(1440061624670807917708947644440855655647248331950114572760004491041044469861865427091855283373146954236633117246745937752162594055383906634366657266450432,16);

Bu 0 döndürür

Yani bcmod ya büyük sayılar ile çalışmıyor