我在这里理解的是小数占用更多空间但提供更短的范围?
正确的。它提供更高的精度和更小的范围。显然,如果位数有限,则只能通过减小范围来提高精度!
每个人都同意当需要精度时应该使用小数
由于这个说法是错误的——特别是我不同意它——你从中得出的任何结论都是不合理的。
使用小数的目的并不是更高的精度。这是较小的表示误差。较高的精度是实现较小表示误差的一种方法,但十进制并不能通过较高的精度来实现较小的表示误差。它通过以下方式实现了较小的表示误差精确表示小数.
小数适用于小数部分的表示错误必须是的情况zero,例如财务计算。
另外,当进行 = (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% 的小数有理数被表示为具有足够大表示误差的双精度数,以至于当乘以分母时它们不会变回整数!
如果您希望对任意有理数进行精确算术,那么 double 和decimal 都不是合适的类型。如果您需要精确地表示有理数,请使用大有理数库。
为什么十进制更精确?
小数比双精度更精确,因为它具有更多的精度位。
但同样,精度实际上并不那么重要。相关的是小数具有较小的表示错误对于许多常见分数来说,比两倍要大。
在表示分母为 10 的小幂的分数时,它的表示误差比 double 更小,因为它是专门设计的使分母中具有小十次方的所有分数的表示误差为零。
这就是为什么它被称为“十进制”,因为它代表十的幂的分数。它代表的是十进制,这是我们常用的算术系统。
相比之下,Double 显然没有被设计为具有较小的表示误差。Double 被设计为具有适合物理计算的范围、精度、表示误差和性能。
物理学中不存在对精确的十进制量的偏见。金融界存在这样的偏见。在金融领域使用小数。在物理中使用双打。