C#的十进制类型会计安全吗?

时间:2014-07-15 16:03:30

标签: c# types decimal

read Decimal类型的范围为(-7.9 x 10 ^ 28到7.9 x 10 ^ 28)/(10 ^ 0到10 ^ 28)并且它是& #34;适用于财务和货币计算。"

我似乎无法找到一个来源,说明Decimal可以代表到便士所有价值从($ 79,000,000,000,000,000,000,000,000,000.00)到$ 79,000,000,000,000,000,000,000,000,000,000,000.00。

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

2 个答案:

答案 0 :(得分:6)

Decimal C# - MSDN

  

十进制值类型表示范围从的十进制数   为负数为79,228,162,514,264,337,593,543,950,335   79,228,162,514,264,337,593,543,950,335。 Decimal值类型是   适用于需要大量资金的财务计算   显着的积分和小数位数以及没有舍入错误。    Decimal类型不会消除舍入的需要。相反,它可以最大限度地减少因舍入而导致的错误。

有关详细信息,您可能会看到Decimal floating point in .NET by Jon Skeet

答案 1 :(得分:1)

  

我似乎无法找到一个消息来源说Decimal可以代表所有价值从($ 79,000,000,000,000,000,000,000,000,000.00)到$ 79,000,000,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是安全限制,那么你应该没问题。