Chinaunix首页 | 论坛 | 博客
  • 博客访问: 990933
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-20 09:44:44

float a = 6.7f;
float b = a * 10;
int c = a * 10;
int d = b;
printf( "%d", c ); // 输出 66
printf( "%d", d ); // 输出 67

在解释结果前,得先了解几个知识点:
1. 即使在表达范围内,浮点数(float、double、long double)也不能精确表达每一个实数。
比如float可以精确表达67.0f,可以精确表达6.69999980926513671875f,但不能精确表达6.7f。
当不能精确表达时,选择一个最接近的能精确表达的数,比如float以6.69999980926513671875f来表达6.7f。
2. 浮点数计算使用80387数字协处理器,把每一个浮点数载入80bits的临时实数中,进行计算,结果然后再放回。
3. 高精度浮点数转化为低精度浮点数时,使用低精度浮点数能表示的最接近的数;浮点数转化为整型时,直接取整数部分。

于是流程如下:
float a = 6.7f;   // a 为 6.69999980926513671875f
float b = a * 10; // 计算结果66.9999980926513671875l 放入 float 中时,变为67.0f,因为67.0f是float能表示的,且最接近66.99……的数。
int c = a * 10;   // 计算结果66.9999980926513671875l 取 整数部分 66
int d = b;        // 67.0f 取 整数部分 67

可见,差别在于C是由long double直接取整数部分,而d是long double放到float后再取的整数部分,奥妙就在“由long double放到float”这一阶段。

 

阅读(1449) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-20 09:45:59

re: 取浮点数的整数部分
double a = 6.7f;
double b = a * 10;
int c = a * 10;
int d = b;

printf( "%d", c ); // 输出 67
printf( "%d", d ); // 输出 66

如果是double的刚好相反也。

网友评论2012-11-20 09:45:40

luoda254
太好了,就是说对一个浮点表达式取整,应该先把该浮点表达式的结果存放在一个浮点变量里,再对该浮点变量取整,对吧?

网友评论2012-11-20 09:45:31

周星星
谢谢,是我的文章标题引起了误解。
容易理解成“(怎样)取浮点数的整数部分”,其实我的原意是“取浮点数的整数部分(时遇到的一个问题)”

网友评论2012-11-20 09:45:23

疯子阿虹
没看懂,不知道作者什么意思?
浮点数取整人人都会吧

INT = INT( FLOAT )          // 直接取舍
INT = INT( FLOAT + 0.5 ) // 四舍五入