带小数的数学计算不正确

Flo*_*jon 1 math decimal

我有一个C#方法,它接受三个string参数.将它们转换为后decimal,我正在尝试执行简单的数学计算.我不明白,为什么结果不对?

decimal d = MyFunction(x, y, z);


public decimal MyFunction(string x, string y, string z)
{
    decimal dx = 0;
    decimal dy = 0;
    decimal dz = 0;

    Decimal.TryParse(x, out dx);
    Decimal.TryParse(y, out dy);
    Decimal.TryParse(z, out dz);

    decimal result = dx - dz + dy;
    return result;
 }
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Jor*_*ren 6

编辑以回复更多问题信息:
我没有看到您的问题.我得到151804.25,这是做的正确结果(1186197.29 - 1260711.19)+ 226318.15.

也许你感到困惑,因为你期望x - z + y表示x - (z + y)而不是(x - z)+ y吗?
C#运算符优先级为 - 和+是从左到右,所以它意味着(x - z)+ y.如果你想要x - (z + y),你将不得不这样写.


浮点运算常常根本不准确的(尽管decimal确实好过了很多float,并double为货币和类似用途).例:

decimal x = 1m / 3m;
decimal y = 0;

for (int i = 0; i < 1e6; i++)
{
    y += x;
}
Run Code Online (Sandbox Code Playgroud)

结果y:

333333.33333333333333333072026

  • @Joren:忽略溢出问题,并假设输入和输出的精度相等,浮动小数点加法/减法*是完全精确的. (4认同)
  • @R.Bemrose:实数的集合是无限的,而可以用Decimal精确表示的数字集是有限的,因此Decimal仍然是近似值. (2认同)