从什么时候开始 3 / 5 = 0?

Since when does 3 / 5 = 0?

所以我得到了一段非常复杂的 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));

产生相同的结果。

怎么回事?

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

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

您可以在 C# reference

中找到更正式的解释

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

所以当你取3 / 5 in integer land时,你不能存储.6的结果。你只剩下 0。小数部分总是被截断,从不四舍五入。大多数编程语言都是这样工作的。

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