Math 十进制的数学计算是';不正确

Math 十进制的数学计算是';不正确,math,decimal,Math,Decimal,我有一个C#方法,它接受三个字符串参数。在将它们转换为十进制后,我尝试执行一个简单的数学计算。我不明白,为什么结果不正确 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);

我有一个C#方法,它接受三个
字符串
参数
。在将它们转换为十进制后,我尝试执行一个简单的数学计算。我不明白,为什么结果不正确

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;
 }

提前感谢。

编辑以响应更多问题信息:
我看不出你有什么问题。我得到了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
做得好得多)。 例如:

十进制x=1m/3m;
十进制y=0;
对于(int i=0;i<1e6;i++)
{
y+=x;
}
y的结果

333333.33333072026


编辑以响应更多问题信息:
我看不出你有什么问题。我得到了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
做得好得多)。 例如:

十进制x=1m/3m;
十进制y=0;
对于(int i=0;i<1e6;i++)
{
y+=x;
}
y的结果

333333.33333072026

如果得到的结果为零,则可能是
TryParse
无法解析字符串

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

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

x
y
z
等于什么?您得到的结果是什么

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

如果得到的结果为零,则可能是
TryParse
无法解析字符串

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

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

x
y
z
等于什么?您得到的结果是什么


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

我想我知道你的问题是什么了。此函数工作正常,但请仔细查看此行:

decimal result = dx - dz + dy;
您可能打算写以下内容:

decimal result = dx + dz + dy;
或者这个:

decimal result = dx - (dz + dy);

我想我明白你的问题所在了。此函数工作正常,但请仔细查看此行:

decimal result = dx - dz + dy;
您可能打算写以下内容:

decimal result = dx + dz + dy;
或者这个:

decimal result = dx - (dz + dy);

我已经计算了三次(1186197.29-1260711.19+226318.15),得到了151804.25


顺便说一句,数字末尾的
M
表示它是一个
十进制数。

我已经计算了三次(1186197.29-1260711.19+226318.15),得到了151804.25



顺便说一句,数字末尾的
M
表示它是一个
十进制数。

您需要提供更多细节:x,y,z等于什么,以及您希望在结果变量中得到什么?想想您的问题,以及您给我们的信息:“为什么
[unknownValue1]-[unknownValue2]+[unknownValue3]=[unknownValue4]
错了?“如果您期望的不是151804.25,那么您就错了。告诉我们您期望的是什么。也许我们会发现计算应该是什么样的。为什么要从问题中删除输入和预期输出?这个问题现在不完整,可能会被否决。你需要提供更多细节:x,y,z等于什么,你希望在结果变量中得到什么?想想你在问什么,以及你给我们的信息:“为什么
[unknownValue1]-[unknownValue2]+[unknownValue3]=[unknownValue4]
错了?”如果您期望的不是151804.25,那么您就错了。请告诉我们您期望的是什么。也许我们会发现计算应该是什么样的。为什么要从问题中删除输入和预期输出?这个问题现在不完整,可能会被否决。@Joren:忽略溢出问题,假设输入和输出的精度相等,浮点小数加减法是完全精确的。十进制值的二进制表示法由一个1位符号、一个96位整数和一个比例因子组成,该比例因子用于除以96位整数,并指定其中哪部分是小数。“换句话说,它不像float或double那样是一个近似值。@R.Bemrose:实数集是无限的,而可以用小数精确表示的数字集是有限的,因此小数仍然是一个近似值。编辑我的答案以显示
十进制
不精确的示例。我不会称之为溢出,这只是精度有限的结果。有限的精度对于这种数据类型来说是非常基本的,尽管它是错误的