【问题标题】:C# decimal type equalityC# 十进制类型相等
【发布时间】:2011-11-21 08:57:05
【问题描述】:

与其他浮点类型相比,C# 十进制类型的相等比较是否更有可能像我们直观预期的那样工作?

【问题讨论】:

    标签: c# .net floating-point decimal equality


    【解决方案1】:

    我想这取决于你的直觉。我假设有些人会认为 1 除以 3 的结果是分数 1/3,而其他人会更多地认为“哦,1 除以 3 不能表示为十进制数,我们'必须决定要保留多少位数,让我们选择 0.333"。

    如果您以前一种方式思考,Decimal 不会对您有太大帮助,但如果您以后一种方式思考,并且在需要时明确表示舍入,那么“直观”的操作更有可能不是可能会出现十进制的舍入错误,例如除以 10,将按照您的预期运行。对于大多数人来说,这比二进制浮点类型的行为更直观,其中 2 的幂表现良好,但 10 的幂则不然。

    【讨论】:

    • -1 因为这并没有真正回答这个问题,除了重新整理我以前的答案。
    • @Noldorin - 我不同意这是重新散列,因为您的回答并未涵盖二进制算术对大多数人来说不直观的问题。另外,我不同意你对平等问题的回答“否”更有可能按预期工作。不是说使用相等是一个好主意,但看看例如由于数字类型为二进制而在各种网站上遇到问题的混淆 Javascript 用户的数量
    • 这与直观无关......这只是内部表示和舍入的方式,我讨论并引用了 MSDN。嗯。
    • @Noldorin - 随便。这个问题专门询问平等是否是直观的。我会说(0.1m + 0.2m == 0.3m) == true(0.1f + 0.2f == 0.3f) == false 直观得多
    • @JonasH:Decimal 的一个好处是,当显示数字时,可以实际看到它们的真实值。关于计算何时产生特定值的规则不一定比double 更直观。例如,加法不是关联的。向Decimal 加一然后减一可能会改变它的值,即使定点数永远不会这样做。
    【解决方案2】:

    基本上没有。 Decimal 类型仅表示一种专门的浮点数,旨在减少舍入误差特别是在基数为 10 的系统中。也就是说,Decimal 的内部表示实际上是以 10 为底(十进制)而不是通常的二进制。因此,它是一种更适合货币计算的类型——尽管当然不限于此类应用。

    来自MSDN page 的结构:

    Decimal 值类型表示从正数 79,228,162,514,264,337,593,543,950,335 到负数 79,228,162,514,264,337,593,543,950,335 的十进制数。 Decimal 值类型适用于需要大量有效整数和小数位数且无舍入错误的财务计算。 Decimal 类型不会消除舍入的需要。相反,它最大限度地减少了由于四舍五入引起的错误。例如,以下代码产生的结果是 0.9999999999999999999999999999 而不是 1。

    十进制数是一个浮点值,它包含一个符号、一个数值,其中每个数字的范围从 0 到 9,以及一个比例因子,该比例因子表示分隔整数的浮点小数点的位置和数值的小数部分。

    【讨论】:

    • 咳咳。否决票,为什么?这个答案完全正确,谢谢。
    猜你喜欢
    • 2021-01-31
    • 2021-02-10
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 2021-11-18
    • 2011-03-15
    • 1970-01-01
    相关资源
    最近更新 更多