[英]Solving arithmetic operations
int a = 3, b = 9, c = 2;
double e = 11, f = 0.1;
e = (b + c) / a * a;
现在,我想知道e
的结果是什么。 当我在脑海中进行数学计算时,我得到的结果是11/9 = 1,22222222
但是
当我在编译器中运行程序时,我只是得到 9. 哪种想法是正确的?
有2件事出了问题,
所以,编译器正在做的是
使用括号,不要使用整数,使用所有双精度数。
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);
那是因为括号中的两个操作都没有余数,但依赖于这些巧合是一种不好的做法。
所有输入变量都是整数,因此算术是作为整数算术完成的。 此外,C# 中的所有算术运算符都是从左到右计算的,所以
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# 中运算符优先级的详细信息,请参阅此 .NET 文档
编译器非常正确 - 您可能需要查看C# 中的运算符优先级是如何工作的。
您有两种选择。使用双精度数而不是整数,或使用显式转换并将您的值之一转换为双精度数
e = (b + c) / (double)(a * a);
此声明:
(b + c) / a * a
评价如下:
(int) / (int)
如果将两个整数相除,如何得到双倍结果? 然后你的结果用隐式类型转换转换双精度。但结果已经是'1'没有浮点,在这种情况下转换是没有意义的。
但是当你做这样的事情时:
e = (b + c) / (double)(a * a);
返回值从b + c
提升为double
然后 (double / double) 除法正在执行。所以你得到正确的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.