c# '十进制记帐安全吗?

本文关键字:安全 十进制 | 更新日期: 2023-09-27 18:12:57

我读到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,000,000,000.00)到$ 79,000,000,000,000,000,000,000.00的所有值。

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

c# '十进制记帐安全吗?

十进制c# - MSDN

Decimal值类型表示从正79,228,162,514,264,337,593,543,950,335到负79228162514264337593543950335年。十进制值类型为适用于需要大量的财务计算有效的整数和小数和没有舍入错误 Decimal类型不能消除舍入的需要。相反,它最大限度地减少了舍入造成的误差。

有关更多信息,请参阅Jon Skeet在。net中的十进制浮点数

我似乎找不到一个来源说Decimal可以表示从($ 79,000,000,000,000,000,000,000,000,000,000,000.00)到$ 79,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是一个安全的限制,那么你应该很好。