与C ++中的简单数学混淆

时间:2016-06-29 01:52:49

标签: c++ math

我今天正在玩C ++,这是我在做一些测试后发现的:

#include <iostream>

using namespace std;

int main()
{
    int myInt = 100;

    int myInt2 = myInt + (0.5 * 17); // the math inside the parentheses should go first

    int difference = myInt2 - myInt; // get the difference of the two numbers

    cout << difference << endl; // difference is 8
}

输出为8

#include <iostream>

using namespace std;

int main()
{
    int myInt = 100;

    int myInt2 = myInt - (0.5 * 17); // the math inside the parentheses should still go first

    int difference = myInt - myInt2; // get the difference of the two numbers

    cout << difference << endl; // difference is 9?
}

输出是9?

所以根据我的第一个代码示例,0.5 * 17 = 8,但根据我的第二个代码示例,0.5 * 17 = 9.我知道如果没有括号我会得到相同的结果,但我使用它们帮助说明我在代码中做了什么。

为了帮助缩小问题范围,我尝试了这个:

#include <iostream>

using namespace std;

int main()
{
    int myInt = 100;

    int myInt2 = 0.5 * 17; // use a variable instead of parentheses

    int myInt3 = myInt + myInt2;

    int difference = myInt3 - myInt; // get the difference of the two numbers

    cout << difference << endl; // difference is 8
}

输出为8

#include <iostream>

using namespace std;

int main()
{
    int myInt = 100;

    int myInt2 = 0.5 * 17; // continue using a variable

    int myInt3 = myInt - myInt2;

    int difference = myInt - myInt3; // get the difference of the two numbers

    cout << difference << endl; // difference is 8 again!
}

输出再次为8!

所以我的问题是,如果括号中的数学总是先出现,那为什么我会得到不同的结果呢?前两次试验不应该与后两次试验的结果相同吗?我应该提到的另一件事是我和其他十进制数字(如0.1和0.3)有相同的结果。

3 个答案:

答案 0 :(得分:3)

表达式0.5 * 17由于其组件之一0.5是浮点而导致浮点值。

但是,当您将一个浮点数(如8.5)分配给一个整数时,它的被截断8。并且,要明确这一点,它在分配时被截断。

因此,当您将其分配给整数(a)时,第一个代码段会计算值100 + 8.5 = 108.5并将其截断为108。从中减去100会为您提供8

在第二个代码段中,您计算​​值100 - 8.5 = 91.5并在分配整数时将其截断为91。从100中减去9会给您8.5

最后两个代码段的工作原因是int myInt2 = 0.5 * 17100中被提前被添加或减去之前被截断来自100 + 8 = 108。在这种情况下,100 - 8 = 92100两者都与8完全不同int myInt2 = myInt + (0.5 * 17); ^ int + double * int | \ \__________/ | \ | | \ double | \_____________/ | | +- truncate <- double (尽管有迹象)。

(a)以图形方式思考它可能会有所帮助:

0.5 * 17
  • 首先计算8.5以给出浮点myInt = 100
  • 然后将其添加到整数108.5以提供浮点108
  • 当分配给整数myInt2时,会将其截断为{{1}}。

答案 1 :(得分:1)

.5 * 17不是8,它是8.5

int myInt = 100;

int myInt2 = myInt + (0.5 * 17);

这计算100 +(0.5 * 17)或108.5,它被截断为108。

int difference = myInt2 - myInt;

这会计算108 - 100或8,这是你看到的结果。

在你的第二个例子中:

int myInt = 100;

int myInt2 = myInt - (0.5 * 17);

计算100 - 8.5或91.5,它被截断为91​​。

int difference = myInt - myInt2;

计算100 - 91或9。

以同样的方式,您可以完成其余的示例。

这是您计算机上非常有用的工具。它被称为&#34;调试器&#34;。使用此工具,您可以逐步浏览任何程序,每行一行,并亲自查看每个步骤中所有变量的值。

答案 2 :(得分:0)

在使用整数进行数学运算时,任何小数部分都会在每个步骤中丢失。

所以.5 * 17给出了8.5,但存储在整数变量中的结果是8,后续步骤中使用了包括输出。