精确损失有多大转换为长到两倍?

时间:2015-09-25 14:00:11

标签: c# casting double long-integer

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

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

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

decimal会更适合这项任务吗?

2 个答案:

答案 0 :(得分:10)

  

long(或表示数字的任何其他数据类型)转换为double会丢失精度。由于浮点数的表示,这是非常明显的。

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

  

如果我将较大的数字转换为双倍,那么精度损失有多大?我是否必须预期差异大于+/- X

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

  

decimal会更适合这项任务吗?

decimal的表示形式与double不同,它使用不同的基础。由于您计划将您的数字除以“小数字”,因此不同的表示形式会给您不同的分歧错误。具体来说,double将更好地处理除以2(2,4,8,16等)的幂的除法,因为这种除法可以通过从指数中减去而不触及尾数来实现。类似地,当除以十,百等时,大decimal s将不会丢失有效数字

答案 1 :(得分:3)

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实现。