Php

使用 PHP 將 satoshis 轉換為比特幣問題

  • December 21, 2017

我遇到了 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 的本機計算不能滿足您的需要。

引用自:https://bitcoin.stackexchange.com/questions/12173