精确损失有多大转换为长到两倍?
我在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位数。 所以将long
成decimal
总是安全的。
建议
我建议你找出你将要使用的数字的确切期望。 然后,您可以在选择适当的数据类型时做出明智的决定。 既然您正在从字符串中读取数字,那么它们是否可能超过28位? 在这种情况下,列出的所有类型都不适合您,而是您必须使用某种BigInt实现。