黑马程序员技术交流社区

标题: 单精度数据类型相关问题求解 [打印本页]

作者: wkop    时间: 2015-11-13 11:01
标题: 单精度数据类型相关问题求解
#include <stdio.h>
int main(int argc, const char * argv[]) {
    float score=0.0f;
    printf("请输入分数:");
    scanf("%f",&score);
    printf("你输入的分数是:%f\n",score);
    return 0;
我输入23.3,打印出来为什么是23.299999
float单精度类型有效数字为7位,小数点后精度为6位,这样打印出来应该是23.3啊?
}

作者: cube川    时间: 2015-11-13 14:15
printf("你输入的分数是:%f\n",score);改成 printf("你输入的分数是:%.2f\n",score);
作者: knight_zfh1288    时间: 2015-11-13 14:36
不限定小数点位数,是默认显示6位显示的,你输入的,23.3,输出23.299999,多出的五位算是垃圾数了
作者: knight_zfh1288    时间: 2015-11-13 14:37
可以使用%.nf控制显示位数,n是几,打印出来就是几位小数。
作者: arhui    时间: 2015-11-13 21:52
学习了 谢谢分享
作者: 且笑着    时间: 2015-11-19 20:40
过来看看  
作者: Tmac90301    时间: 2015-11-19 23:46
不指定域宽,浮点数默认打印6位。对于计算机,23.299999=23.0,所以并不算是垃圾数吧
作者: 正在输入中...    时间: 2015-11-20 00:17
因为float单精度的类型默认就是6位,如果想要限制位数,可以看这个帖子:http://bbs.itheima.com/forum.php ... p;page=1#pid2046076
作者: 正在输入中...    时间: 2015-11-20 00:22
刚才不小心发出去了,因为浮点数在内存中和int或者char存储的机制不一样的,比如说int和char在内存中都是以补码的形式存储的,而浮点数是采用移码的形式存储的,这种存储方式就造成了浮点数容易丢失精度的特点。也就是说浮点数不能进行判等运算,比如 float a = 8.0 / 7; if (a*7 == 8)这个是不成立的。你可以自己试下,一般如果判等的话都是用:比如判断浮点数是否为零:if (a < 0.000001 && a > -0.000001) 这样来写。
作者: blazehot18    时间: 2015-11-20 00:23
加油,越来越好
作者: 打滚的橘子    时间: 2015-11-20 03:30
即使这样写,打印出来也应该是23.3啊,内存会是23.299999,但是打印出来还应该是输入的数,没超过长度的话。楼主是用Xcode试的吗?
作者: wkop    时间: 2015-11-20 08:36
打滚的橘子 发表于 2015-11-20 03:30
即使这样写,打印出来也应该是23.3啊,内存会是23.299999,但是打印出来还应该是输入的数,没超过长度的话 ...

恩,是用Xcode试的。为什么会出现这个现象应该是涉及到底层数据的处理问题吧。至于底层数据是怎么运转的我也不清楚,以后精力有限的情况下再研究吧,  ios自学视频进行中…
作者: 唐阿丽    时间: 2015-11-20 12:39
过来看看  
作者: ToBeJeek1    时间: 2015-11-20 12:46
单精度浮点型有效位为7位,默认小数位数为6位
作者: 打滚的橘子    时间: 2015-11-21 04:18
wkop 发表于 2015-11-20 08:36
恩,是用Xcode试的。为什么会出现这个现象应该是涉及到底层数据的处理问题吧。至于底层数据是怎么运转的 ...

准备报哪期?
作者: wkop    时间: 2015-11-21 07:58
打滚的橘子 发表于 2015-11-21 04:18
准备报哪期?

1月10号那一期,你呢?
作者: springD    时间: 2015-11-21 12:05
本帖最后由 springD 于 2015-11-21 13:45 编辑


浮点数据在计算机中以以上方式存储,用2进制来表示小数部分以及用2的幂次方来表示指数部分。float数据存放小数的位数为23位。以6.25为例,换为2进制为110.01,转换为浮点数据的科学计数为1.1001*2^2。23.5换为2进制数为10111.1,转换为浮点数据的科学计数为1.01111*2^4。我们发现2进制的科学计数的整数部分都为1,因此可以省却不存储,因此23位的尾数实际上的存储精度是24位。
我们将6.25的2进制数存储在内存中
10010000 00000000 00000000
23.5的2进制数存储在内存中
01111000 00000000 00000000
9的2进制数为1001,任何一个10进制个位数可以用4位2进制数表示,因此23位尾数的存储精度位(23+1)/4=6.
作者: 我有个少年梦    时间: 2015-11-21 12:15
加油不错哦加油不错哦
作者: wx_YXxWrUwd    时间: 2015-11-21 14:46
过来看看,
作者: 打滚的橘子    时间: 2015-11-22 03:58
wkop 发表于 2015-11-21 07:58
1月10号那一期,你呢?

我准备报长沙的,也是1月的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2