代码之家  ›  专栏  ›  技术社区  ›  chikak

为什么decimal.maxvalue-0.5的结果是整数?

  •  5
  • chikak  · 技术社区  · 15 年前

    我今天在玩十进制。我注意到这一点:

    Decimal.MaxValue 
    79228162514264337593543950335
    
    Decimal.MaxValue - 0.5m
    79228162514264337593543950334
    

    以下代码为真。

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

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

    3 回复  |  直到 13 年前
        1
  •  11
  •   Bevan    15 年前

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

    对于这个十进制数:

    79228162514264337593543950335
    

    所有的96位都用在小数点的左边——没有什么可以代表答案的小数部分。所以,它是圆的。

    如果将数字除以10:

    7922816251426433759354395033.5
    

    然后有一些位可以表示小数部分,但只有1/10,没有更好的。

    关键区别在于 decimal double / float 它是基于 十进制的 比例因子指定 小数点 ;其他浮动类型基于 二元的 比例因子指定 二进制点 .

        2
  •  1
  •   Anton Tykhyy    15 年前

    0.5 在减法之前被取整。 decimal 努力使结果尽可能精确,因此操作变得 79228162514264337593543950335 - 00000000000000000000000000000.5 . 但是 零点五 不能表示为 十进制的 达到要求的精度,并向上舍入至 1 .

        3
  •  0
  •   alanc    13 年前

    它不是整数,而是 事实上 Decimal .

    整数(Int32)可以具有从负2147483648到正2147483647的值。

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

    在显示和精度方面, 79228162514264337593543950334.5 不能用表示 十进制的 .

    this 更多细节(每个计算机科学家都应该知道关于浮点运算的知识)。

    推荐文章