从什么时候开始 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
类型。
所以我得到了一段非常复杂的 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
类型。