如果范围较短,为什么小数点比双精度点更精确? C#

时间:2018-11-01 19:06:45

标签: c# floating-point double decimal

我正在看一本Nutshell书中的C#,它显示了此表: enter image description here

我很难理解表格。它说双精度占用64 bits的空间,范围从10^-32410^308。 小数占用128 bits的空间,但也表示它的范围从10^-2810^28。因此,我对此的理解是,十进制占用更多空间但提供了更短的范围?在我看来,这没有多大意义,因为每个人都同意在需要精度时应使用小数。 同样,在进行= (1/3)*3之类的计算时,期望结果为1,但是只有floatdouble给我1decimal给我我0.9999 ...为什么decimal更精确?我真的不明白。

2 个答案:

答案 0 :(得分:16)

  

我在这里了解的是小数占用更多空间,但提供了更短的范围?

正确。它提供了更高的精度和更小的范围。显然,如果位数有限,则只能通过减小范围来提高精度!

  

每个人都同意在需要精度时应使用小数点

由于该陈述是错误的-特别是我不同意-您从中得出的任何结论都是不正确的。

使用十进制的目的不是更高的精度。这是较小的表示错误。较高的精度是实现较小表示误差的一种方法,但是十进制不能通过较高精度来实现较小的表示误差。通过精确表示小数部分,可以实现较小的表示误差。

十进制用于那些小数部分的表示误差必须为的情况,例如财务计算。

  

当进行=(1/3)* 3之类的计算时,期望结果为1,但只有float和double给我1

您很幸运。对于浮点数和双精度数,很多分数的计算表示误差都不为零。

让我们快速检查一下有多少个。我们将做出一百万个理智,然后看看:

    var q = from x in Enumerable.Range(1, 1000)
            from y in Enumerable.Range(1, 1000)
            where ((double)x)/y*y != x
            select x + " " + y;
    Console.WriteLine(q.Count()); // 101791

所有小数有理数中超过10%被表示为具有足够大表示误差的双精度数,以至于乘以它们的分母时它们不会变成整数!

如果您想对任意有理数进行精确算术,则双精度和十进制都不适合使用。 如果您需要精确表示理性,请使用大理性图书馆。

  

为什么十进制更精确?

小数比双精度更精确,因为它具有更多的精度位。

但是,精度实际上并没有那么重要。重要的是,对于许多常见分数,十进制的表示误差比双精度小。

在分母中以10的小幂表示分数时,表示误差小于双精度,因为专门设计使在分数中以10的小幂表示的所有分数具有零表示误差。分母。

这就是为什么它被称为“十进制”的原因,因为它表示具有10的幂的个分数。它表示十进制系统,这是我们通常用于算术的系统。

相比之下,

Double显然没有设计成具有较小的表示误差。 Double被设计为具有适用于物理计算的范围,精度,表示误差和性能。

在物理上,没有偏向于精确的小数位数。财务上有这样的偏见。 使用小数点表示财务信息。为物理使用双打。

答案 1 :(得分:4)

十进制不使用指数来增加范围,它包含所有数字(大约29个数字),其中double使用一个指数,但是仅包含大约19个数字,其余数字被丢弃。指数增加了范围,但没有增加准确性。