c# - 将 long 转换为 double 的精度损失有多大?

标签 c# casting double long-integer

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

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

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

decimal 是否更适合这项任务?

最佳答案

converting long (or any other data type representing a number) to double loses precision. This is quite obvious due to the representation of floating point numbers.

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

How big is the loss of precision if I convert a larger number to double? Do I have to expect differences larger than +/- X

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

Would decimal be more appropriate for this task?

decimaldouble 具有不同的表示形式,并且使用不同的基数。由于您打算将您的数字除以“小数字”,因此不同的表示形式会给您带来不同的除法错误。具体来说,double 会更好地处理除以 2 的幂(2、4、8、16 等),因为这种除法可以通过从指数中减去来完成,而无需触及尾数。同样,大的 decimal 在除以 10、100 等时不会丢失有效数字。

关于c# - 将 long 转换为 double 的精度损失有多大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32783923/

相关文章:

ios - 错误:无法推断出通用参数“元素”

c++ - 将奇怪的字符串转换为双C++

c、printf、 double : getting more than 15 decimal digits

c# - 设置 myButton.Enabled = true 会触发单选按钮的 CheckedChanged 处理程序

c# - 使用 Kestrel 在端口 80 上运行多个 ASP.NET Core(3.1x/最新)网站

c# - 如何处理 Form 上的大量控件?

实体和管理器抽象的 C++ 设计

c# - 如何创建 LINQ 表达式来调用方法?

c++ - 将 PyArrayObject* 转换为 int* 失败

java - 如何将 6020494385.89982 字符串值转换为 double