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

时间:2012-03-27 13:28:48

标签: c# numbers floating-point floating-accuracy subtraction

我是C#的初学者,我正在使用浮点数。我需要在这两个数字之间进行减法,但它不起作用。我知道这是由浮点数引起的,但我该如何解决呢?如果你这么好,你可以解释一下为什么会发生这种情况吗?提前谢谢。

5 个答案:

答案 0 :(得分:10)

考虑使用decimal而不是float:

// 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

答案 1 :(得分:8)

这不是一个c#问题,这是一个计算机科学问题。如果您想真正了解正在发生的事情,请阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic。如果你只关心你遇到问题的原因,那就是因为Float和Double在这个平台上只分别精确到7位和15位,你需要应用舍入逻辑来达到你想要的结果。

Float C# reference

Double C# reference

  

将无数多个实数压缩成有限数量的位   需要近似的表示。虽然有无限的   许多整数,在大多数程序中,整数计算的结果都可以   以32位存储。相反,给定任意数量的位,   大多数带有实数的计算都会产生数量   不能使用那么多位来精确表示。因此   浮点计算的结果通常必须按顺序舍入   以适应其有限的表示。这个舍入误差是   浮点计算的特征。 Goldberg 1991

答案 2 :(得分:5)

你究竟在计算什么?

        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

对我来说,这些计算给出了正确的结果。

答案 3 :(得分:1)

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

Here是此论坛上的一个问题,涉及主题<​​/ p>

如果你真的想深入研究这个主题,here是如何检查浮点行为的一个很好的来源

答案 4 :(得分:0)

取决于您可以使用十进制类型,或按原样存储,但在显示答案之前进行舍入