2011-03-25 87 views
0
Why this condition is never true ? Both parts of the equation are integers, so there must be equality for index = 0, 10, 20, 30, 40. I am compiling this code using g++. 

for(int index = 0; index < 50; index++){ 

     if ((int) (10 * ( 0.1 * index) == (int)(10 * (int) (0.1 * index)))) 
     { 
       std::cout << "equal"; 
     } 
} 

随着MSVS 2010编译器不会发生这些问题的平等......C++,用G ++

0 0 
    1 0 
    2 0 
    3 0 
    4 0 
    5 0 
    6 0 
    7 0 
    8 0 
    9 0 
    10 10 
    11 10 
    12 10 
    13 10 
    14 10 
    15 10 
    16 10 
    17 10 
    18 10 
    19 10 
    20 20 
    21 20 
    22 20 
    23 20 
    24 20 
    25 20 
    26 20 
    27 20 
    28 20 
    29 20 
    30 30 
    31 30 
    32 30 
    33 30 
    34 30 
    35 30 
    36 30 
    37 30 
    38 30 
    39 30 
    40 40 
    41 40 
    42 40 
    40 40 
    44 40 
    45 40 
    46 40 
    47 40 
    48 40 
    49 40 
+0

这是因为在平等的第二部分你用“(int)”来整数。 10 *(int)的(0.1 *指数),15就变成 10 *(int)的(0.1 * 15),这成为 10 *((int)的1.5)变成 10 * 1 – sashoalm 2011-03-25 17:44:06

+0

克的哪个版本++你正在用吗?适用于我。 – jbp 2011-03-25 17:39:20

回答

11

你的括号是错误的:

if ((int) (10 * ( 0.1 * index) == (int)(10 * (int) (0.1 * index)))) 

应该是:

if ((int) (10 * ( 0.1 * index)) == (int)(10 * (int) (0.1 * index))) 
+0

(+1)斑点! – NPE 2011-03-25 17:38:57

+0

谢谢,它的工作原理... – johny 2011-03-25 17:43:16

0

你比较两个浮点数 - 0.1 *指数。

您是否尝试过打印出各个组件时不是等于?我怀疑你会发现在这个等式的某个地方,结果会有所不同。

0

这是因为在第二部分,你有(INT)(0.1 *指数)。所以(INT)(0.1 * 5)变圆0

-1

尝试

for(int index = 0; index < 50; index++){ 

     if ((int) (10 * ( 0.1 * (double)index)) == (int)(10 * (int) (0.1 * (double)index))) 
     { 
       std::cout << "equal"; 
     } 
} 
+0

-1:为什么不试图将变量的名称从'index'更改为'i'?为什么不尝试使用'stdio.h'而不是'iostream'?为什么不尝试使用'unsigned'而不是'int'? ......“尝试”(如果我们排除诸如性能或用户界面设计等一些领域)在编程中没有意义。想想,然后做,或不。没有尝试。 – 6502 2011-03-25 17:54:37

+0

说你会怎么样,我试过,它的工作:) RAD编程是代码首先想想以后。这一切都取决于你在做什么...... – 2011-03-25 17:56:06

+0

这是因为你没有一个正确的“工作”的概念(这并不意味着你发现至少有一个案例,它给出了你认为正确的结果)。尽管“尝试看”一般对于编程来说是不好的,但它在C++中是一种真正的自杀,因为语言会用未定义的行为守护进程来惩罚你的错误,而不是用运行时错误天使来惩罚你的错误。 – 6502 2011-03-25 18:07:01

0

双方不都是整数:

10 * (0.1 * index) 

是双,并且使用0.1,作为你可能知道不能完全用IEEE754格式表示(只有当n> = 0时,才能完全表示的值是1 /(2^n)的整数倍)。为了与人类通常使用的底座10平行,电脑会看到0.1或多或少像你看到的那样0.3333333333333...(并且你没有使用无限纸来记录所有那些三)。

你应该遵循ybungalobill的建议,顺便说一句,对我来说,使用基于整数算术和模运算符的不同方法解决问题会容易得多。

if (index % 10 == 0) 

似乎是你正在寻找的测试。