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

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

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

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

decimal是否更适合此任务?

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

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

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

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

decimal是否更适合此任务?

decimal具有与double不同的表示forms,并且它使用不同的基数。 由于您计划将您的数字除以“小数字”,因此不同的表示会给您不同的分歧错误。 具体来说, double将更好地处理除以2(2,4,8,16等)的幂的除法,因为这种除法可以通过从指数中减去而不触及尾数来实现。 类似地,当除以十,百等时,大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位数。 所以将longdecimal总是安全的。

建议

我建议你找出你将要使用的数字的确切期望。 然后,您可以在选择适当的数据类型时做出明智的决定。 既然您正在从字符串中读取数字,那么它们是否可能超过28位? 在这种情况下,列出的所有类型都不适合您,而是您必须使用某种BigInt实现。