在 C# 应用程序中添加双精度产生奇怪的结果

本文关键字:结果 双精度 应用程序 添加 | 更新日期: 2023-09-27 18:30:54

我已经阅读了很多关于浮点数和舍入错误的内容,但我还没有找到任何特定于我的问题。

这是发生的事情

我加上 15.95,

然后加上 15.95,数字变成 31.9(末尾没有零)。然后当我添加 19.95 时,它变成 51.849999999999994。是什么原因导致这种情况发生?如果我需要提供实际代码,我可以这样做。谢谢!

在 C# 应用程序中添加双精度产生奇怪的结果

归根结底,这是因为一些以 10 为底的数字(如 0.9)不能以有限位数以 2 为底表示,就像分数 1/3 不能以有限位数以 10 为底表示(你得到 0.333...)。

转换为基数

2 的 0.9 是 0.1110011001100...,并且此二进制表示被截断,因此结果是接近 0.9(以 10 为基数)的数字,但小。

请注意,您不会看到数字 0.9 的这种行为,因为浮点数的系数为 9,尾数为 -1。 但是你会看到它的系数为 31.9,因为它的系数为 3.19(以 2 为底 = 11.00>11000010100011110101<><标记之间的重复部分)和 +1 的尾数。