免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5298 | 回复: 6
打印 上一主题 下一主题

[C] 浮点数怎么取到正确的小数位? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-26 21:10 |只看该作者 |倒序浏览
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4. //   float num;
  5.     double num;
  6.     printf("input a float between 100~999:");
  7.     scanf("%lf", &num);

  8.     printf("num[4]=%d", (int)num/100);
  9.     printf("num[3]=%d", ((int)num%100)/10);
  10.     printf("num[2]=%d", ((int)num%10));
  11.     printf("num[1]=%d\n", ((int)(num*10))%10);

  12.     return 0;
  13. }
复制代码
小数点最后一位有的时候不能正确取到,比如输入123.6 ,得到的小数点最后一位是5.
原因我知道,是浮点数存储的精度。不过怎么解决呢?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2014-03-27 10:55 |只看该作者
首先,浮点数不能精确表示123.6,可能实际存储的是 +123.599999999999994315658113919198513031005859375
其次,对于浮点数而言 a/b*b 未必等于 a

你的设计有问题
用浮点数,就别谈什么数位
淡数位,就别用浮点数

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2014-03-27 11:27 |只看该作者
浮点数的精度用有效位数来衡量,不是小数位

论坛徽章:
0
4 [报告]
发表于 2014-03-27 11:44 |只看该作者
bruceteen 发表于 2014-03-27 10:55
首先,浮点数不能精确表示123.6,可能实际存储的是 +123.599999999999994315658113919198513031005859375
...


谢谢了,说的对,是我一开始就不应该在浮点数上保证绝对精度、

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2014-03-27 12:21 |只看该作者
caiwei_cs 发表于 2014-03-27 11:44
谢谢了,说的对,是我一开始就不应该在浮点数上保证绝对精度、

有一个原因在于计数的不一样,
浮点数用的是二进制,
而我们平常表示是用十进制。
十进制下的有限小数到了二进制下好多都成了无限循环小数

论坛徽章:
0
6 [报告]
发表于 2014-03-27 15:24 |只看该作者
不光是精度的问题,涉及UI展现的话有时候必须要还原一个无法表示的浮点数。
我使用的场合要求不高,所以一般有效位的后两位是“99”的话就进一
比如123.5999998,就判为123.6

论坛徽章:
0
7 [报告]
发表于 2014-03-27 23:31 |只看该作者
搞这么多年开发还真没用过什么浮点运算哦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP