解决算术运算

时间:2014-01-06 17:31:30

标签: c# math

int a = 3, b = 9, c = 2;
double e = 11, f = 0.1;

e = (b + c) / a * a;

现在,我想知道e的结果是什么。当我在脑海中进行数学计算时,我得到的结果为11/9 = 1,22222222

但是

当我在编译器中运行程序时,我只是得到9.想想的方法是对的吗?

4 个答案:

答案 0 :(得分:7)

有两件事出了问题,

  • 您误解了您的操作顺序
  • 你的整数正在截断

所以,编译器正在做的是

  • 9 + 2 = 11
  • 11/3 = 3.666截断为3
  • 3 * 3 = 9

使用括号,不要使用整数,使用所有双精度。

double a = 3, b = 9, c = 2, d;
double e = 11, f = 0.1;
string s = "AB", t = "BA", v;

            e = (b + c) / (a * a);

如果a,b和c都必须是整数,那么你可以投射它们

int a = 3, b = 9, c = 2, d;
double e = 11, f = 0.1;
string s = "AB", t = "BA", v;

            e = ((double)b + (double)c) / ((double)a * (double)a);

现在可以通过

轻松完成
e = (double)(b + c) / (double)(a * a);

这是因为括号中的两个操作都没有留下余数,但依靠这种巧合是不好的做法。

答案 1 :(得分:1)

所有输入变量都是整数,因此算术以整数运算方式完成。此外,C#中的所有arithemtic运算符都是从左到右计算的,所以

e = (b + c) / a * a相当于e = ((b + c) / a ) * a

(b + c ) / a * a = ((9 + 2) / 3) * 3
                 = (11 / 3) * 3
                 = 3 * 3
                 = 9

我认为你想要的表达是

e = (double)(b + c) / (a * a);

有关C#中运算符优先级的详细信息,请参阅this .NET documentation

答案 2 :(得分:0)

编译器非常正确 - 您可能想要查看operator precedence in C# works

的方式

答案 3 :(得分:0)

你有两个选择。使用双精度而不是整数,或者使用显式强制转换并将你的一个值转换为双精度

 e = (b + c) / (double)(a * a);

本声明:

(b + c) / a * a

评估如下:

(int) / (int)

如果你划分两个整数,你怎么能得到双重结果?然后你的结果用隐式类型转换转换为double。但是没有浮点的结果已经是'1',在这种情况下转换是没有意义的。

但是当你做这样的事情时:

e = (b + c) / (double)(a * a);

b + c提升到double然后(双/双)除法的返回值正在执行。所以你得到了正确的结果。