【问题标题】:Is C#'s Decimal Type Accounting Safe?C# 的小数类型记帐安全吗?
【发布时间】:2014-07-15 16:03:29
【问题描述】:

read 认为 Decimal 类型的范围为 (-7.9 x 10^28 到 7.9 x 10^28) / (10^0 到 10^28) 并且它“适用于金融和货币计算。”

我似乎找不到一个消息来源说 Decimal 可以一分钱表示从 ($79,000,000,000,000,000,000,000,000,000.00) 到 $79,000,000,000,000,000,000,000,000,000.00 的所有值。

Decimal 是 128 位的类型,128 位可以表示从 -10^38 到 10^38 的每一分钱。但我不知道 Decimal 是如何实现的,因此与 floats 一样,数字从 0 越远,精度可能会损失一分钱。

【问题讨论】:

  • 小数引起的舍入误差直接转入比尔盖茨的私人银行账户。
  • 请记住,如果您想保持精确到一分钱,那么您的“最大”值实际上是Decimal.MaxValue / 100

标签: c# types decimal


【解决方案1】:

Decimal C# - MSDN

Decimal 值类型表示十进制数,范围从 正 79,228,162,514,264,337,593,543,950,335 转负 79,228,162,514,264,337,593,543,950,335。十进制值类型是 适用于需要大量的财务计算 有效的整数和小数位数以及没有舍入错误Decimal 类型并不能消除舍入的需要。相反,它可以最大限度地减少由于四舍五入引起的错误。

更多信息您可以查看Decimal floating point in .NET by Jon Skeet

【讨论】:

【解决方案2】:

我似乎找不到一个消息来源说 Decimal 可以表示从 ($79,000,000,000,000,000,000,000,000,000.00) 到 $79,000,000,000,000,000,000,000,000,000.00 美元的所有值。

那是因为它不能decimal 允许最多 29 位有效数字的精度。这意味着如果您想保持一分钱的准确性,那么您的最大安全值实际上是(Decimal.MaxValue -1)/100(或$792,281,625,142,643,375,935,439,503.30

(Decimal.MaxValue - (Decimal.MaxValue - 0.01m))                  == 0
(Decimal.MaxValue/100- (Decimal.MaxValue/100 - 0.01m))           == 0  // why?
(((Decimal.MaxValue-1)/100)- ((Decimal.MaxValue-1)/100 - 0.01m)) == 0.01

注意:我不确定为什么 Decimal.MaxValue/100 不起作用,但如果 Decimal.MaxValue - 1 是安全限制,那么你应该没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多