从什么时候3/5 = 0?

时间:2015-02-05 19:58:02

标签: c# math ncalc

所以我有一个很好的复杂的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));

产生相同的结果。

发生了什么事?

2 个答案:

答案 0 :(得分:6)

/运算符查看其操作数,当它发现它们是两个整数时,它返回一个整数。如果你想获得一个double值,那么你需要将两个整数之一转换为double

double difference = (endX - startX + 1) / (double)ordinates;

您可以在C# reference

中找到更正式的说明

答案 1 :(得分:1)

他们被称为整数。整数不存储数字的任何小数部分。此外,当您将整数除以另一个整数时...结果仍然是整数。

因此,当您在整数范围内取3/5时,无法存储.6结果。你剩下的就是0.小数部分总是被截断,永远不会被舍入。大多数编程语言都是这样工作的。

对于类似的内容,我建议您使用decimal类型。