将 long 转换为 double 的精度损失有多大?

How big is the precision loss converting long to double?

我在 Whosebug 和 C# 文档中阅读了不同的 post,将 long(或表示数字的任何其他数据类型)转换为 double 会失去精度。由于浮点数的表示,这一点非常明显。

我的问题是,如果我将较大的数字转换为 double,精度损失有多大?我必须期望差异大于 +/- X 吗?

我想知道这一点的原因是我必须处理一个 long 的连续计数器。这个值被我的应用程序读取为 string,需要转换并且必须除以例如10 或其他一些小数字,然后进一步处理。

decimal 是否更适合这项任务?

long

long 是一个 64 位整数类型,可以保存从 –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 的值(最多 19 位)。

double

double 是 64 位浮点型,精度为 15 到 16 位。因此,如果您的数字大于 ~100,000,000,000,000,数据肯定会丢失。

decimal

decimal是一个128位的十进制类型,最多可以容纳28-29位数字。所以将 long 转换为 decimal.

总是安全的

推荐

我建议您找出对您将使用的数字的确切期望。然后您可以在选择合适的数据类型时做出明智的决定。由于您是从字符串中读取数字,它们是否有可能大于 28 位数字?在这种情况下,none 列出的类型将适合您,而您必须使用某种 BigInt 实现。

converting long (or any other data type representing a number) to double loses precision. This is quite obvious due to the representation of floating point numbers.

这没有看起来那么明显,因为精度损失取决于 long 的值。对于 -252 和 252 之间的值,根本没有精度损失。

How big is the loss of precision if I convert a larger number to double? Do I have to expect differences larger than +/- X

对于数量级高于 252 的数字,您将遇到一些精度损失,具体取决于您超过 52 位限制的程度。如果 long 的绝对值适合 58 位,那么精度损失的幅度将为 58-52=6 位,或 +/-64。

Would decimal be more appropriate for this task?

decimaldouble 具有不同的表示形式,并且使用不同的基数。由于您计划将数字除以 "small numbers",因此不同的表示形式会给您带来不同的除法错误。具体来说,double 会更好地处理除以 2 的幂(2、4、8、16 等),因为这种除法可以通过从指数中减去来完成,而无需触及尾数。类似地,大的 decimal 在除以十、百等时不会丢失有效数字