减去双打时的奇怪结果

Mik*_*ike 8 c# double

可能重复:
为什么C#中的浮点运算不精确?

我一直在处理一些数字和C#,以下代码行产生的数字与预期的数字不同:

double num = (3600.2 - 3600.0);
Run Code Online (Sandbox Code Playgroud)

我预计num为0.2,但结果是0.1999999999998181.是否有任何理由产生一个接近但仍然不同的小数?

Ada*_*lph 10

这是因为double是浮点数据类型.

如果您想要更高的准确度,可以转而使用decimal.

文字后缀为decimalm,因此要使用decimal算术(并生成decimal结果),您可以将代码编写为

var num = (3600.2m - 3600.0m);
Run Code Online (Sandbox Code Playgroud)

请注意,使用a有一些缺点decimal.它是128位数据类型,而不是64位,是a的大小double.这使得它在存储器和处理方面都更加昂贵.它的范围也小得多double.

  • 什么时候关于IEEE 754类型的错误信息会停止?它不是一种不精确的类型!它是一种精确类型,但它只能代表有限的数字范围.所有未精确表示的数字都是近似的,这是错误的原因.如果你只想在类型的范围内表达2的幂,你将永远不会失去浮点精度. (6认同)
  • 这与你有多少精确度无关(除非你当然有无限精度).这是从一个基地到另一个基地的转换,这创造了这个. (2认同)