C#减法错误?12.345-12=0.345000000000001



我是C#的初学者,我正在处理浮点数。我需要在这两个数字之间做减法,但它不起作用。我知道这是由浮点数引起的,但我该如何修复它?如果你表现得很好,你能解释一下为什么会发生这种情况吗?提前谢谢。

考虑使用十进制而不是浮点:

// Instead of this...
float a = 12.345F;
float b = 12;
float c = a - b;
// Use this: 
decimal d = 12.345M;
decimal e = 12;
decimal f = d - e;

Jon Skeet在这个答案中很好地解释了这两种类型之间的差异:https://stackoverflow.com/a/618596/446681

这不是c#问题,这是计算机科学问题。如果你想真正了解发生了什么,请阅读《每个计算机科学家都应该知道的浮点运算》。如果你只是关心为什么会出现问题,那是因为在这个平台上,Float和Double分别只精确到7位和15位,你需要应用舍入逻辑来实现你想要的结果。

浮动C#参考

双C#参考

将无限多个实数压缩为有限位数需要近似表示。尽管有无限许多整数,在大多数程序中,整数计算的结果可以以32位存储。相反在给定任何固定位数的情况下,大多数使用实数的计算都会产生不能使用那么多比特来精确地表示。因此浮点计算的结果必须经常按顺序四舍五入以适应其有限表示。此舍入误差是浮点计算的特征。Goldberg 1991

您究竟是如何计算的?

        float a = 12.35F;
        float b = 12.0F;
        float ans = a - b; //0.350000381
        double x = 12.35;
        double y = 12.0;
        double ans2 = x - y; //0.34999999999999964
        decimal n = 12.35m;
        decimal m = 12.0m;
        decimal ans3 = n - m; //0.35

对我来说,这些计算结果是正确的。

请记住,浮点的行为可能因使用的处理器而异。

这是这个论坛上的一个问题,涉及主题

如果你真的想深入研究这个主题,这里有一个关于如何检查浮点的行为的好消息来源

根据您可以使用十进制类型,也可以按原样存储,但在显示答案之前进行四舍五入

相关内容

  • 没有找到相关文章

最新更新