我很难理解表格。它说双精度占用64 bits
的空间,范围从10^-324
到10^308
。
小数占用128 bits
的空间,但也表示它的范围从10^-28
到10^28
。因此,我对此的理解是,十进制占用更多空间但提供了更短的范围?在我看来,这没有多大意义,因为每个人都同意在需要精度时应使用小数。
同样,在进行= (1/3)*3
之类的计算时,期望结果为1
,但是只有float
和double
给我1
,decimal
给我我0.9999
...为什么decimal
更精确?我真的不明白。
答案 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个数字,其余数字被丢弃。指数增加了范围,但没有增加准确性。