我一直在处理一些数字和C#,以下代码行导致的数字与预期不同:
double num = (3600.2 - 3600.0);
我预计num为0.2,但结果是0.1999999999998181。是否有任何理由产生一个接近但仍然不同的小数?
答案 0 :(得分:10)
这是因为double
是浮点数据类型。
如果您想要更高的准确度,可以转而使用decimal
。
decimal
的文字后缀为m,因此要使用decimal
算术(并生成decimal
结果),您可以将代码编写为
var num = (3600.2m - 3600.0m);
请注意,使用decimal
有一些缺点。它是128位数据类型,而不是64位,是double
的大小。这使得它在存储器和处理方面都更加昂贵。它的范围也比double
小得多。
答案 1 :(得分:1)
有一个原因。
原因是,在双数据类型的情况下,数字存储在内存中的方式不允许精确表示数字3600.2。它也不允许精确表示数字0.2。
0.2具有二进制的无限表示。如果要将其存储在存储器或处理器寄存器中,要执行某些计算,则会存储一些接近0.2且具有有限表示的数字。如果您运行这样的代码,可能并不明显。
double num = (0.2 - 0.0);
这是因为在这种情况下,可用于表示双数据类型中的数字的所有二进制数字用于表示数字的小数部分(仅存在小数部分)并且精度更高。如果将数字3600.2存储在double类型的对象中,则某些数字用于表示整数部分 - 3600,并且表示小数部分的数字较少。精度较低,实际存储在内存中的小数部分差别为0.2,从双精度转换为字符串后变得明显
答案 2 :(得分:0)
请参阅Wikipedia
无法更好地解释它。我也建议阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic。或者查看StackOverflow上的相关问题。
答案 3 :(得分:0)