2014-02-27 55 views
3

我想在比特幣數值上進行數學運算時避免任何精度錯誤。比特幣數字格式化

1)'十進制'是在C#中用於比特幣貨幣的最佳選擇嗎?

2)當從字符串轉換爲數字時,是否有任何我需要注意的精度錯誤?

感謝

+0

根據我的理解,十進制是任何高精度值的首選格式 – devshorts

+0

請不要包含關於問題標題中使用的語言的信息,除非在沒有它的情況下沒有意義。標籤用於此目的。 –

回答

2

比特幣量的範圍可以從1聰(0.00000001 BTC)到近 2,100,000,000,000,000(21000000 BTC)。爲避免舍入錯誤,您必須確保您的PHP實現支持全範圍的比特幣值,而不會損失精度。大多數PHP實現使用 IEEE 64位雙精度浮點數與53位精度爲 ,這足以正確表示 比特幣值的全部範圍。

儘管這與PHP有關,但它仍然相關。如所建議的,您應該使用十進制值類型。

最後的塊,將產生硬幣將是塊#6929999這 應在2140年或附近產生,然後流通 硬幣總數將在20,999,999.9769 BTC保持不變。 即使允許的精度從當前的8位小數擴展, 總流通的BTC總是會略低於2100萬 (假設其他條件保持不變)。例如,精度小數爲16, ,最終總數將爲20,999,999.999999999496, BTC。

字符串的一個例子被轉換爲十進制並保持精度:

var maxBtc = "20999999.999999999496"; 
var maxBtcDecimal = Decimal.Parse(maxBtc, NumberStyles.AllowDecimalPoint); 

轉換回:

var maxBtcString = Convert.ToString(maxBtcDecimal); 

簡單的數學:

var oneBtc = new decimal(1.000000000000); 
var newBtcValue = maxBtcDecimal - oneBtc; 
+0

謝謝,這應該工作! – OneEyed

+0

不客氣..我希望你做下一個Gox^_- –

+0

使用CultureInfo.InvariantCulture也可以爲您節省一些麻煩 – lxnt

0

From MSDN

相比於浮點類型,小數類型有更高的精度和更小的範圍內,這使得它適合金融和貨幣計算。

如果您正在對比特幣金額進行數學運算,您應該使用十進制。

Decimal.Parse() 

應該用來從字符串轉換爲十進制。另見本other Stackoverflow question

1

十進制是最好的可用選項。

看看這方面的工作C#比特幣庫,它使用十進制的比特幣價值:https://github.com/GeorgeKimionis/BitcoinLib

你需要知道,在C#十進制是不固定的,浮動的,所以你需要配置你的O/RM或您的DB精確保留8個小數點。