double型数据内存存储方式问题

日常调试时发现一个问题,感觉与浮点数在内存中的存储方式有关,但又不知道其中的规律,还请大牛进行讲解。
简单的验证代码如下:
int main(int argc, const char * argv[]) {
// insert code here...
double x_1 = 2.3991;
double x_2 = 2.4991;
double z_1 = x_1*10000;
double z_2 = x_2*10000;
int y_1 = (int)(z_1);
int y_2 = (int)(z_2);
return 0;
}
运行结果为:
y_1 = 23990 ; y_2=23991;
其中,单步运行的情况如下图所示:图片说明

http://canlynet.iteye.com/blog/1796889

double、float等浮点型数据在内存中的表示如下:(十进制采用科学计数法)阶码表示指数部分、尾码表示小数部分。
当我们把一个十进制的数转换成二进制的时候可能出现无限循环的情况,如十进制的0.2转换成二进制表示的时候就会无限循环。
然而在机器中(假设32位),double占据8B,其中15或16bits用于表示小数部分,那么此时对于无限循环的情况只能近似表示。
那么在转换成十进制的时候自然而然存在精度缺失的现象,如你单步运行所看到的现象所示。
那么为了解决这种问题,通常我们对于浮点数的操作都是采取近似的方法,如浮点数的比较在精度范围内相等则默认两个数相等等等。