数据精度问题,最后一位应该是0,却变成了1

mao_miaoxi 2014-07-20 03:52:20


如图,第一个数据应该是21.290000的啊。。。
...全文
533 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_17012035 2014-07-22
  • 打赏
  • 举报
回复
浮点型 在计算机内存中 以32为存在内存中,也就是4个字节,后面0-22位是用来寸后面的小数部分的,你自己算下小数部分转化为二进制。是通过*2 ,直到基数部分为0 算下 0.29*2 基数为0 0.58*2 基数为1. 继续。。。。
辰岡墨竹 2014-07-22
  • 打赏
  • 举报
回复
不过这个是不能完全消除的,因为有些十进制的有限小数转换为二进制后会变成无限小数,有限位数的float、double总是会有精度的问题。最好的解决办法是限定一定精度四舍五入掉。4楼的方法其实也算一种四舍五入,因为printf会做这个
勤奋的小游侠 2014-07-21
  • 打赏
  • 举报
回复
float只保证6到7位,超过7的其它范围不保证
赵4老师 2014-07-21
  • 打赏
  • 举报
回复
wu424602394 2014-07-21
  • 打赏
  • 举报
回复
float形有效数字超过指定长度后,不能保证后面数字的精度,float和double的精度是由尾数的位数来决定的。 float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) 23bits(尾数位) double: 1bit(符号位) 11bits(指数位) 52bits(尾数位) float:2^23 = 8388608,一共七位 double:2^52 = 4503599627370496一共16位 所以呢..
#include <stdio.h>

void main()
{
	double f;
	scanf("%lf",&f);			
	printf("%f or %e\n",f,f);
    return 0;
}
mao_miaoxi 2014-07-21
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
http://bbs.csdn.net/topics/390676437
找老师的回复太过高深,看不懂。。。
mao_miaoxi 2014-07-21
  • 打赏
  • 举报
回复
引用 4 楼 wu424602394 的回复:
float形有效数字超过指定长度后,不能保证后面数字的精度,float和double的精度是由尾数的位数来决定的。 float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) 23bits(尾数位) double: 1bit(符号位) 11bits(指数位) 52bits(尾数位) float:2^23 = 8388608,一共七位 double:2^52 = 4503599627370496一共16位 所以呢..
#include <stdio.h>

void main()
{
	double f;
	scanf("%lf",&f);			
	printf("%f or %e\n",f,f);
    return 0;
}
恩恩,谢谢,的确可以。。。我开始也试过double,但是不行,对比你的代码,原因在 %lf 哈哈,原来如此。。。
707wk 2014-07-20
  • 打赏
  • 举报
回复
某些数值的确会出现这种问题
ImAmelie 2014-07-20
  • 打赏
  • 举报
回复
对于浮点型数据如果输入的十进制数不能完美的转换成二进制小数的话存储就会出现点问题 21.29转换成二进制数(小数精度为500) 10101.01001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111... 对于float型数据存储尾数(M)为23位,这样肯定会出现问题 对于能完美转换成二进制数的十进制数,如1.5 转换成二进制数为1.1 这类数值存储就不会出现问题,楼主可以试试!
  • 打赏
  • 举报
回复
引用 楼主 mao_miaoxi 的回复:
如图,第一个数据应该是21.290000的啊。。。
浮点数的这种问题,确实存在。即使换成double型的也是一样的。 所以判断两个浮点数相当,或者浮点数是否等于0,的程序一定要慎重。

70,014

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧