繁体   English   中英

解决算术运算

[英]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件事出了问题,

  • 你对操作顺序的误解
  • 你的整数被截断

所以,编译器正在做的是

  • 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);

那是因为括号中的两个操作都没有余数,但依赖于这些巧合是一种不好的做法。

所有输入变量都是整数,因此算术是作为整数算术完成的。 此外,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM