我已经在stackoverflow和C#文档中的不同帖子中读到,将long
(或代表数字的任何其他数据类型)转换为double
会失去精度。由于浮点数的表示,这是非常明显的。
我的问题是,如果我将较大的数字转换为double
,精度会有多大损失?我是否必须预期差异大于+/- X?
我想知道的原因是,我必须处理一个long
的连续计数器。我的应用程序将此值读为string
,需要进行转换,并且必须按例如10或其他一些小数字,然后进一步处理。
decimal
会更适合这项任务吗?
答案 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实现。