比特币数字格式化

4

我希望在进行比特币价值计算时避免任何精度误差。

1)在 C# 中,使用“decimal”是否是比特币货币的最佳选项?

2)在将字符串转换为数字时,是否需要注意任何精度误差?

谢谢。


据我所知,十进制是任何高精度值的首选格式。 - devshorts
请不要在问题标题中包含有关所使用编程语言的信息,除非没有它就没有意义。标签可以起到这个作用。 - Ondrej Janacek
@OndrejJanacek 为什么不包括编程语言呢?这样可以更方便地扫描谷歌搜索结果。 - duhaime
3个回答

4
比特币的数量范围从1 Satoshi(0.00000001 BTC)到接近2,100,000,000,000,000(21,000,000 BTC)不等。为了避免舍入误差,您必须确保您的PHP实现支持Bitcoin价值的完整范围而不失精度。大多数PHP实现使用IEEE 64位双精度浮点数,具有53位精度,这足以正确表示比特币价值的全范围。

虽然这与PHP有关,但仍然相关。建议使用Decimal值类型。

最后一个生成比特币的区块将是第6,929,999个区块,应在2140年左右生成。流通中的比特币总数将保持静态,为20,999,999.9769 BTC。即使扩展了当前8个小数的精度,流通中的总BTC也始终略低于2100万(假设其他所有内容保持不变)。例如,使用16位小数精度,最终总计将为20,999,999.999999999496 BTC。

将字符串转换为Decimal并保持精度的示例:

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;

1
使用CultureInfo.InvariantCulture也许能够帮你避免一些麻烦。 - lxnt

1

十进制是目前最好的选择。

看看这个使用十进制表示比特币价值的工作中C#比特币库:https://github.com/GeorgeKimionis/BitcoinLib

需要注意的是,在C#中,十进制并不是固定浮点数,因此您需要配置您的O/RM或DB以保留正好8个小数点。


0

来自MSDN

与浮点类型相比,十进制类型具有更高的精度和更小的范围,这使得它非常适用于财务和货币计算。

如果您正在进行比特币金额的数学运算,应该使用Decimal。

Decimal.Parse()

应该使用 Decimal 将字符串转换为十进制。此外,请参阅其他 Stackoverflow 问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接