2015-09-25 98 views
8

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

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

我想知道这个的原因是我必须处理连续的计数器,它是一个long。我的应用程序将此值读取为string,需要投射并且必须除以例如。 10或其他一些小号码,然后进一步处理。

decimal会更适合这项任务吗?

+0

好吧'decimal'当然可以将所有信息保存在'long'中......但它确实不清楚您的要求是。 –

+0

@JonSkeet实际上没有,我知道如何用小数解决它,但问题或多或少地出于好奇。我需要多少精确的损失。 – John

回答

8

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

这似乎并不明显,因为精确度损失取决于long的值。对于-2 和2 之间的值,根本没有精度损失。

如果我将更大的数字转换为双倍,精度的损失有多大?我有期待的差异比+/- X

大得多,数量与幅度超过2 你会遇到一些精度损失,这取决于你有多少上面的52位限制去。如果您的long的绝对值符合比如58位,那么精度损失的幅度将是58-52 = 6位或+/- 64。

decimal会更适合这项工作吗?

decimaldouble有不同的表示形式,它使用不同的基数。既然你打算用“小数字”来划分你的电话号码,不同的表示会给你分配上不同的错误。具体而言,double将更好地处理两个权力的分割(2,4,8,16等),因为这种分割可以通过从指数中减去而不触及尾数来完成。同样,大的decimal s将不会受到有效数字的损失,除以十,一百等。

+0

完美!我认为这个计算会给我精确度损失,但不确定。损失实际上比我预期的要小。谢谢! – John

3

long

long是一个64位的整数类型,并且可以从-9,223,372,036,854,775,808保存值9,223,372,036,854,775,807(最多19个位数)。

double

double是具有15至16位精度64位浮点型。所以如果你的数字大于100,000,000,000,000,数据肯定会丢失。

decimal

decimal是一个128位小数类型,并且可以容纳多达28-29个数字。所以将long转换为decimal总是安全的。

建议

我会建议你了解你将要工作的人数的准确预期。然后,您可以在选择适当的数据类型时做出明智的决定。既然你是从一个字符串中读取你的数字,他们不可能超过28位数字吗?在这种情况下,列出的所有类型都不适用于您,而您必须使用某种BigInt实现。

+0

可以肯定的是,它不会超过long的范围。感谢你的回答! – John