【问题标题】:Bitcoin Number Formatting比特币号码格式
【发布时间】:2014-03-31 08:58:02
【问题描述】:

我想在对比特币值进行数学运算时避免任何精度错误。

1) 在 C# 中,“十进制”是比特币货币的最佳选择吗?

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

谢谢

【问题讨论】:

  • 据我了解,十进制是任何高精度值的首选格式
  • 请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标记用于此目的。
  • @OndrejJanacek 为什么不包括该语言?它使 Google 结果更易于扫描

标签: c# decimal precision number-formatting bitcoin


【解决方案1】:

From MSDN

与浮点类型相比,十进制类型具有更高的精度和更小的范围,这使其适用于金融和货币计算。

如果您要对比特币金额进行数学运算,则应使用 Decimal。

Decimal.Parse()

应该用于从字符串转换为十进制。另见other Stackoverflow question

【讨论】:

    【解决方案2】:

    比特币数量可以从 1 Satoshi (0.00000001 BTC) 到几乎 2,100,000,000,000,000(21,000,000 比特币)。为避免舍入错误,您 必须确保你的 PHP 实现支持所有的 比特币价值不失精度。大多数 PHP 实现使用 IEEE 64 位双精度浮点数,53 位 精度,足以正确表示整个范围 比特币价值。

    尽管这与 PHP 相关,但它仍然是相关的。按照建议,您应该使用 Decimal 值类型。

    最后一个产生硬币的区块将是区块#6,929,999 应在 2140 年或附近产生。 流通中的硬币将保持不变,为 20,999,999.9769 BTC。 即使允许的精度从当前的 8 位小数扩展, 流通中的比特币总量将始终略低于 2100 万 (假设其他一切都保持不变)。例如,16 精度小数,最终总数为 20,999,999.999999999496 比特币。

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

    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;
    

    【讨论】:

    • 使用 CultureInfo.InvariantCulture 也可以为您省点麻烦
    【解决方案3】:

    十进制是最好的选择。

    看看这个使用 Decimal 表示比特币值的 C# 比特币库:https://github.com/GeorgeKimionis/BitcoinLib

    您需要注意,在 C# 中 Decimal 不是固定浮动的,因此您需要配置您的 O/RM 或您的 DB 以准确保留 8 个小数点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 2019-05-16
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多