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