我認為不再需要擔心尾隨的空值。這已在 2002 年 2 月修復(參見錯誤 10133)
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
gmp_strval — 將 GMP 數字轉換為字串
num
將被轉換為字串的 GMP 數字。
一個 GMP 物件、一個 整數,或是一個可以被解讀為數字的 字串。此字串的解讀邏輯與使用自動進位偵測的 gmp_init() 相同(例如當 base
參數為 0 時)。
base
回傳數字的進位。預設進位為 10。允許的進位值範圍從 2 到 62,以及 -2 到 -36。
以 字串 形式表示的數字。
範例 #1 將 GMP 數字轉換為字串
<?php
$a = gmp_init("0x41682179fbf5");
printf("十進位:%s,36 進位:%s", gmp_strval($a), gmp_strval($a,36));
?>
值得注意的是,使用 gmp_strval 處理大型數字可能會大大降低腳本的執行速度。
例如,這個腳本會連續產生階乘
<?php
$start = microtime(TRUE);
$fact = gmp_init(1, 10);
for($i=1;$i<100000;$i++) { // 計算 100,000 個階乘
$fact = gmp_mul($fact, $i); // $fact 現在是第 $i 個階乘的結果
// gmp_strval($fact, 10); // 詳見下方...
if(microtime(TRUE)-$start>1) // 1 秒後停止計算
break;
}
// 印出耗時 1 秒完成的結果
printf("\$i = %d\n\$fact = %s\n", gmp_strval($fact, 10));
?>
我的伺服器每次平均計算到大約第 69,500 個階乘。取消註釋 gmp_strval 那行程式碼會大幅降低計算速度,只能計算到大約 5,000 個階乘。這比之前慢了大約 14 倍(無論允許它運行多少秒,不僅僅是 1 秒,結果都是一致的)。
Nitrogen(氮氣)。
使用 gmp_strval 的值作為關聯陣列鍵值時的一個陷阱。某些大於 2^31 的數字會被轉換為帶符號整數格式,這通常是不正確的。
<?php
$a = gmp_init('2147483649'); // = 2^31 + 1
$b = gmp_init('3173604585'); // = 2^31 < $b < 2^32
$c = gmp_strval($a);
$d = gmp_strval($b);
$e = array($c => 'c', $d => 'd');
print '*** 預期 '."\n";
print '陣列 '."\n".'('."\n".' ['.$c.'] => c'."\n".' ['.$d.'] => d'."\n".')'."\n\n";
print '*** 實際 '."\n";
print_r($e);
?>
輸出
*** 預期
陣列
(
[2147483649] => c
[3173604585] => d
)
*** 實際結果
陣列
(
[-2147483647] => c
[3173604585] => d
)
解決方法是先格式化為 16 進制,並在用作鍵值之前加上 '0x'。
警告:gmp_strval 可能會返回一個以 null 結尾的字串(例如,gmp_strval(gmp_init(8)) 有兩個字元)。這是因為 gmp 為了速度而設計,所以使用基於它可以快速獲得的東西的估計值,例如 N 的位數。因此,由於 8 是一個 4 位數字,它將被分配 ceil(log10(2^4))=ceil(4*0.30103....) = 2 個字元。gmp 開發者認為檢查是否需要所有字元是呼叫者的責任(在這種情況下是 PHP 介面)。PHP 可能已經為我們這樣做了(並且將來可能會),但目前,您需要檢查(如果這對您很重要——在我的程式中確實如此!)。