-8

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

产生相同的结果。

这是怎么回事?

4

2 回答 2

6

/ 运算符查看它的操作数,当它发现它们是两个整数时,它返回一个整数。如果要取回双精度值,则需要将两个整数之一转换为双精度

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

您可以在C# 参考中找到更正式的解释

于 2015-02-05T20:00:18.353 回答
1

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

因此,当您在整数土地上取 3 / 5 时,您无法存储 .6 结果。你只剩下 0。小数部分总是被截断,从不四舍五入。大多数编程语言都是这样工作的。

对于这样的事情,我建议decimal改为使用这种类型。

于 2015-02-05T20:01:42.643 回答