为什么Decimal.MaxValue - 0.5的结果是整数?

时间:2010-08-17 09:20:42

标签: c# .net decimal

我今天正在玩小数。我注意到了这一点:

Decimal.MaxValue 
79228162514264337593543950335

Decimal.MaxValue - 0.5m
79228162514264337593543950334

以下代码打印为true。

static void Main(string[] args)
        {
            decimal d = Decimal.MaxValue - 0.5M;
            var b = d % 1 == 0;
            Console.WriteLine(b);

        }

我确信这背后有一个原因,但我不知道它是什么。

3 个答案:

答案 0 :(得分:11)

十进制类型使用96位来存储数字序列(ref),加上一个符号(1位)和一个指定小数位的位置的缩放因子。

对于此十进制数字:

79228162514264337593543950335

所有96位都用在小数点的左边 - 没有任何东西可以代表答案的小数部分。因此,它变得圆润。

如果您将数字除以10:

7922816251426433759354395033.5

然后你有几个位可用于表示小数部分 - 但只有1/10,没有更精细。

decimaldouble / float之间的主要区别在于它基于十进制比例因子,指定了十进制的位置点;其他浮动类型基于二进制缩放因子,指定二进制点的位置。

答案 1 :(得分:1)

在减法之前,

0.5被舍入。 decimal努力使结果尽可能精确,因此操作变为79228162514264337593543950335 - 00000000000000000000000000000.5。但0.5无法表示为所需精度的decimal,而是向上舍入为1

答案 2 :(得分:0)

它不是整数, 实际上是Decimal

整数(Int32)的值为负2,147,483,648,正数为2,147,483,647。

正如您所看到的,这远远超出了这些范围。

就显示和准确性而言,79228162514264337593543950334.5无法表示Decimal

阅读this了解更多详情(每位计算机科学家应该了解浮点运算)。