PHP Conference Japan 2024

gmp_strval

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_strval將 GMP 數字轉換為字串

說明

gmp_strval(GMP|int|string $num, int $base = 10): string

將 GMP 數字轉換為以 base 為基底的字串表示。預設基底為 10。

參數

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));
?>

新增註記

使用者貢獻的註記 5 則註記

php at richardneill dot org
18 年前
我認為不再需要擔心尾隨的空值。這已在 2002 年 2 月修復(參見錯誤 10133)
Nitrogen
9 年前
值得注意的是,使用 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(氮氣)。
russell dot s dot harper at gmail dot com
14 年前
使用 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'。
caldwell at utm dot NoSpamPlease dot edu
23 年前
警告:gmp_strval 可能會返回一個以 null 結尾的字串(例如,gmp_strval(gmp_init(8)) 有兩個字元)。這是因為 gmp 為了速度而設計,所以使用基於它可以快速獲得的東西的估計值,例如 N 的位數。因此,由於 8 是一個 4 位數字,它將被分配 ceil(log10(2^4))=ceil(4*0.30103....) = 2 個字元。gmp 開發者認為檢查是否需要所有字元是呼叫者的責任(在這種情況下是 PHP 介面)。PHP 可能已經為我們這樣做了(並且將來可能會),但目前,您需要檢查(如果這對您很重要——在我的程式中確實如此!)。
匿名
4 年前
強制轉換為字串似乎也能達到同樣的效果(對於 10 進制),而且速度要快得多

(string) $num

取代

gmp_strval($num)
To Top