我是C#的初学者,我正在使用浮点数。我需要在这两个数字之间进行减法,但它不起作用。我知道这是由浮点数引起的,但我该如何解决呢?如果你这么好,你可以解释一下为什么会发生这种情况吗?提前谢谢。
答案 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位,你需要应用舍入逻辑来达到你想要的结果。
将无数多个实数压缩成有限数量的位 需要近似的表示。虽然有无限的 许多整数,在大多数程序中,整数计算的结果都可以 以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)
答案 4 :(得分:0)
取决于您可以使用十进制类型,或按原样存储,但在显示答案之前进行舍入