减去双打时的奇怪结果

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

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

double num = (3600.2 - 3600.0); 

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

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

如果您想要更高的准确度,您可以切换到使用decimal

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

 var num = (3600.2m - 3600.0m); 

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

有一个原因。

原因是,在双数据类型的情况下,数字存储在存储器中的方式不允许精确表示数字3600.2。 它也不允许精确表示数字0.2。

0.2具有二进制的无限表示。 如果要将其存储在存储器或处理器寄存器中,要执行某些计算,则会存储一些接近0.2且具有有限表示的数字。 如果你运行这样的代码可能不明显。

 double num = (0.2 - 0.0); 

这是因为在这种情况下,可用于表示双数据类型中的数字的所有二进制数字用于表示数字的小数部分(仅存在小数部分)并且精度更高。 如果将数字3600.2存储在double类型的对象中,则某些数字用于表示整数部分 – 3600,并且表示小数部分的数字较少。 精度较低,事实上存储在内存中的小数部分相差0.2,足以在从double转换为字符串后变得明显

将您的类型更改为decimal

 decimal num = (3600.2m - 3600.0m); 

你也应该读这个 。

见维基百科

无法解释得更好。 我还建议阅读每个计算机科学家应该知道的关于浮点运算的内容 。 或者在StackOverflow上查看相关问题。