int a = 3, b = 9, c = 2;
double e = 11, f = 0.1;
e = (b + c) / a * a;
现在,我想知道e
的结果是什么。当我在脑海中进行数学计算时,我得到的结果为11/9 = 1,22222222
但是
当我在编译器中运行程序时,我只是得到9.想想的方法是对的吗?
答案 0 :(得分:7)
有两件事出了问题,
所以,编译器正在做的是
使用括号,不要使用整数,使用所有双精度。
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
然后(双/双)除法的返回值正在执行。所以你得到了正确的结果。