Php
使用 PHP 將 satoshis 轉換為比特幣問題
我遇到了 PHP 計算問題(我認為 - 我對 PHP 相當陌生)。
我在用
function convertToBTCFromSatoshi($value){ $BTC = ($value / 100000000 ); return (float)$BTC; }
如果 $value = 10000 結果是正確的 “0.0001”
然而,如果 $value = 5000 結果是“-5.0E-5”
請有任何想法:-)
您真的不應該將浮點數學用於精度十進制值。電腦程式的一個鮮為人知的事實是,當您處理金錢時,您應該避免像瘟疫一樣使用通常的 IEEE 浮點數學。
這就是比特幣交易將值儲存為 64 位整數的原因。 因為將它們儲存為浮點數很容易出錯。
例如,在您的互動式 PHP shell 中,您可以執行以下操作來找出您的數學開始中斷的位置:
php > echo 10000.00000001 * 2; 20000.00000002 php > echo 100000.00000001 * 2; 200000.00000002 php > echo 1000000.00000001 * 2; 2000000
我也在執行 64 位 PHP。如果您正在執行 32 位 PHP,情況會變得非常糟糕。
這裡的要點是浮點數的整體精度是有限的。你的數字越大,它可以有的有意義的小數位數就越少。
解決這個問題的正確方法是使用 PHP 的BC Math函式。您將數據保存為字元串,BCMath 將允許您執行任意精度的計算。它沒有浮點數學那麼快,但也不是很慢。
/** Convert Satoshis to a string that can be displayed to users. * input: $value Integer or string that can be parsed as an int. * output: string (eg: "1.00400000") */ function convertToBTCFromSatoshi($value){ return bcdiv( intval($value), 100000000, 8 ); }
如果要從輸出末尾修剪零,可以使用以下
trim()
函式:rtrim($value, "0"); // trim zeros from the right-hand side
您應該使用bcmath,因為 PHP 的本機計算不能滿足您的需要。