中易网

请问C语言问题:float型数据转int,把整数部分和小数部分分开放在两个int型变量里,怎么尽量减小误差?

答案:4  悬赏:0  
解决时间 2021-01-23 09:10
请问C语言问题:float型数据转int,把整数部分和小数部分分开放在两个int型变量里,怎么尽量减小误差?
最佳答案
float型数据精度只有 有效数字 6-7 位,所以存放 12345.53231 时,只能精确到 12345.53。

要存放 12345.53231,可以用 double 或 char s[].

double 仍有 10进制到2进制,2进制回10进制的误差问题。

#include

int main(){

double x = 12345.53231;

int a,b;char s[30];

int i;a = (int) x; // a 没问题

b = (x-a) * 100000; // 这里要假定取多少位小数

printf("a=%d b=%d\n",a,b);

sprintf(s,"%15.5lf",x);//用这个方法转字符串。

// 当然最好是一开始声明 char s[30]=“12345.53231”;就不必转化。

sscanf(s,"%d.%d",&a,&b);// 注意 格式里 有个小数点符号

printf("a=%d b=%d\n",a,b);

}

输出:

a=12345 b=53231

a=12345 b=53231
追问:多谢了!单片机的传感器收到数据12345,把它做个数据转换,用到的方法是float 12345/36776.0,然后把float的整数和分数部分分别存放到int型变量b,c中,该怎么做小数部分的误差才最小?有什么好办法?除了强制转换?(因为我确认强制转换会极大降低float精度,即使先*1000000再转换为long型数据,然后%得到某个位数的数字。。。。这样的方法误差也是很大的。。。!!!)
追答:通常,传感器得到的是模拟量,通过A/D转换,得到数字量。
数的精度由A/D转换器硬件决定了 -- 满度值是多少,分辨率是多少。
我估计,你的单片机也就是6-7位十进制的精度。整数部分位数多了,小数部分就少了。
靠计算方法并不能提高测试精度。
在模拟量方面是否可以做点工作,例如调节偏移量(或常说的调零)和放大倍数,使试验数据用到接近满度。另外,把实验结果和传感器器标定(率定)曲线送到PC机上处理。这是从根本上提高精度。
追问:朋友你好,在pc上如何处理?能提高精度?C++?例如收到传感器数据a=12345,满度值是b=32676,然后把a和b数据送到pc处理?精度能达到多少?有代码吗?。另外你说的调零和率定没学过,呵呵,有代码可以发到我扣扣邮箱150116230
追答:调零和率定没学过 -- 那就说来话长了。
满度 32676,分辨率为1, a=12345,所以你的小数部分也就只能1位精度。

传感器 信号 通常是电压,物理量可以格式各样,例如温度,压力,长度,速度,应力,频率等等,电压 到 物理量 的转换 关系,通常是非线性的,它们直接关系通过 率定 得到 (厂方或用户)。电压 到 物理量 的转换 计算,pc 比 单片机 方便。特别是 你的 通道很多时。
例如,我的情况,常有 100 个左右的通道/传感器 数据,一组实验完毕,运行一个批程序,全部结果就出来了(数据表,图形曲线,统计参数等)。pc 不能提高测量精度,但不会减低精度。
追问:哦,明白了我想把传感器返回数据12345除以32576,得到浮点数c,后面跟个单位G(重力加速度),精度和单片机的还是差不多啊,有啥好办法?除非用dobule来计算,精度才高?
追答:是的,要用double。否则 除法 还会带来新的误差。乘法 重力加速度 9.80665 也有纬度误差。
总之,有效数字只有6-7位。
全部回答
先把整数部分取出来,小数部分嘛,想保留多少位就放大10^n倍就行了
首先定义变量 int a,b ; float c,d
然后将c值赋予给a,即a得到c的整数部分
接着用d=c-a,d为c的小数部分
最后确定出你要精确的位数,将d乘以对应的10的N次方,就可以了
追问:不是你想的那么简单的,小数部分的数据会变化的!有误差!
这个看精度要求,浮点数本身就不是很精确的。如果要求很精确的分离两者,可以从二进制的定义着手,float型数据定义如下:1bit(符号位) 8bits(指数位) 23bits(尾数位)
可以考虑将其转换为long,再将整数值扣除,从而获得小数
追问:我把小数的小数部分用*10^n来把小数部分也挪移到整数部分,然后转换为long型数据,再用%...来取原小数部分的那些数据串,也不行!还是有误差,而且差小数点后三位的精确度!!!
追答:你的这个n值怎么确定的?
追问:想把小数部分的几位转移到整数部分,n就是几啊!
追答:你把你的源代码贴上来看看
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎样赚取更多天猫积分?
大三考研,本科学港口航道与海岸工程跨考船舶
草字头加个安念什么
第一台计算机的电子元件以什么为基础
二乙酰氧基富马酸二甲酯的欧盟海关编码是什么
求我为老人送祝福手抄报内容
碧水天和项目东面要建新南宁南站?
新疆喀什现在治安状况如何
灿辉家教中小学寄膳中心地址好找么,我有些事
扁平疣做冷冻的问题
关于Servlet的session问题
年薪应不应该一次性付清?
欧普四开单控开关怎么接
de或fr开头的6位单词,越多越好
黑裤子搭配什么上衣和鞋子?
推荐资讯
女傲名店(新金都东)地址有知道的么?有点事想
婆婆总爱用白矾水给宝宝擦嘴,说是预防马牙吃
所有的美好 都是恰逢其时什么意思
第一次去男朋友家里,和他睡在同一张床上好吗
电子商务职业经理人培训地点是在哪里啊?
放开户籍制度和二胎政策有什么利弊?谁懂?说
唐山银泰证券是国企吗
去俄罗斯做试管婴儿需要带什么证件,需要结婚
益赛普一周打了3针有问题吗?
请问北京百子湾修空调维修哪家专业?
高尔夫6的缺点
多乐士乳胶漆优势哪位来介绍下?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?