<强>可能重复:结果   在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。这是相对于64位,它是一double的大小的128位的数据类型。这使得它无论是在存储和处理方面更加昂贵。它也有一个更小的范围比double

其他提示

有一个原因。

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

0.2具有二进制无限表示。如果你想将其存储在存储器或处理器寄存器,执行一些计算,一些数量接近0.2有限表示存储来代替。如果运行这样的代码可能不是显而易见的。

double num = (0.2 - 0.0);

这是因为在这种情况下,可用于表示双数据的类型的数的所有二进制数字被用来表示数的小数部分(仅存在小数部分),并且精度更高。如果存储在双型的一个目的数3600.2,某些数字被用来代表的整数部分 - 3600和不存在表示小数部分较少位数。精度是实际上存储在存储器中,从0.2足够不同,它从双到字符串转换后变得明显降低和小数部分

更改类型decimal

decimal num = (3600.2m - 3600.0m);

您也应该阅读

请参阅维基百科

无法更好地解释它。我也建议您阅读什么每台计算机科学家应该知道关于浮点运算。或见 StackOverflow的

相关问题
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top