所以我有一个很好的复杂的C#代码,用于替换数学方程式。它的工作几乎完美。但是,当给出等式(x - y + 1) / z
和值x=2
y=0
z=5
时,它会失败并且莫名其妙地失败。
问题不在于值传递给函数错误。没关系。问题是无论我使用什么类型,C#似乎都认为3/5 = 0。
以下是有问题的代码:
public static void TrapRule(string[] args)
{
// ...
string equation = args[0];
int ordinates = Convert.ToInt32(args[1]);
int startX = Convert.ToInt32(args[2]);
int endX = Convert.ToInt32(args[3]);
double difference = (endX - startX + 1) / ordinates;
// ...
}
它被传递给args
:
args[0] = Pow(6,[x])
args[1] = 5
args[2] = 0
args[3] = 2
(顺便说一下,使用NCalc,所以Pow()
函数得到了评估 - 它工作得很好。)
结果呢? difference = 0
。
使用float
和尝试简单数学时会发生同样的事情:
Console.Write((3 / 5));
产生相同的结果。
发生了什么事?
答案 0 :(得分:6)
/运算符查看其操作数,当它发现它们是两个整数时,它返回一个整数。如果你想获得一个double值,那么你需要将两个整数之一转换为double
double difference = (endX - startX + 1) / (double)ordinates;
您可以在C# reference
中找到更正式的说明答案 1 :(得分:1)
他们被称为整数。整数不存储数字的任何小数部分。此外,当您将整数除以另一个整数时...结果仍然是整数。
因此,当您在整数范围内取3/5时,无法存储.6结果。你剩下的就是0.小数部分总是被截断,永远不会被舍入。大多数编程语言都是这样工作的。
对于类似的内容,我建议您使用decimal
类型。