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

13

我在stackoverflow和C#文档的不同帖子中阅读到,将long(或任何其他表示数字的数据类型)转换为double会丢失精度。这很明显是由于浮点数的表示。

我的问题是,如果我将一个较大的数字转换为double,会丢失多少精度? 我是否需要预计差异大于+/- X?

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

对于这项任务,decimal是否更合适?


“decimal”可以确保在“long”中保存所有信息……但是您的要求并不清楚。 - Jon Skeet
@JonSkeet 实际上没有,我知道如何用十进制解决它,但问题更多是出于好奇。我需要期望多少精度损失。 - user3712853
2个回答

15
long(或任何其他数据类型表示数字)转换为 double 会失去精度。这很明显是由于浮点数的表示方式所造成的。
这比看起来更不明显,因为精度损失取决于 long 的值。对于 -252 至 252 之间的值,根本没有精度损失。
如果要将大于 252 的数值转换为 double,则会经历一些精度损失,具体取决于超过 52 位二进制限制的数量。如果您的 long 的绝对值适合 58 位二进制,那么您的精度损失大小将为 58-52 = 6 位二进制,即 +/-64。 decimal 的表示方式与 double 不同,并且它使用不同的基数。由于您计划将数字除以“小数”,不同的表示方法会在除法时产生不同的误差。具体而言,double 在处理二的幂次方(2、4、8、16 等)相除时会更好,因为这样的除法可以通过从指数中减去而不触及尾数来完成。同样,大的 decimal 在被十、百等除数除时也不会失去任何有效数字。

太好了!我以为这个计算会导致精度损失,但不确定。实际上,损失比我预期的要小。谢谢! - user3712853

4

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位数字更大吗?在这种情况下,列出的任何类型都无法使用,而必须使用某种BigInt实现。


肯定不会超出long的范围。感谢您的回答! - user3712853

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接