带小数的数学计算不正确

时间:2009-09-25 13:19:04

标签: 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;
 }

提前致谢。

4 个答案:

答案 0 :(得分: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),你将不得不这样写。


浮点计算通常从根本上说是不精确的(尽管decimalfloatdouble的货币和类似用途要好得多。 例如:

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

for (int i = 0; i < 1e6; i++)
{
    y += x;
}

y的结果:

  

333333.33333333333333333072026

答案 1 :(得分:4)

如果你得到的结果是零,那么可能是TryParse无法解析字符串。

您应该将TryParse的调用替换为decimal dx = Decimal.Parse(x);,并查看是否会引发异常。

如果这不是问题,在您提供更多详细信息之前,我们无法帮助您。

xyz等于什么,你得到的结果是什么?

编辑:为了回应添加到问题中的其他信息,似乎其他人都是正确的,问题可能是缺少括号。

答案 2 :(得分:2)

我想我知道你的问题是什么。这个功能正常,但仔细看看这一行:

decimal result = dx - dz + dy;

您可能打算写这个:

decimal result = dx + dz + dy;

或者这个:

decimal result = dx - (dz + dy);

答案 3 :(得分:2)

我已经三次完成了这个计算(1186197.29 - 1260711.19 + 226318.15),我得到151804.25。

顺便说一下,数字末尾的M意味着它是Decimal