问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言中如何把浮点型转换为字符型

发布网友 发布时间:2022-04-13 01:21

我来回答

3个回答

懂视网 时间:2022-04-13 05:43

类型转换是我们日常开发中经常会遇到的一个需求,最近在将浮点型转换成字符型的时候就遇到了一个问题,所以总结分享出来,下面这篇文章主要给大家介绍了MySQL中关于浮点型转字符型可能遇到的问题的相关资料,需要的朋友可以参考下。

前言

本文主要给大家介绍了MySQL中在将浮点型转字符型的时候遇到的一个问题,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

一 问题描述

今天遇到一个刷数据的需求,是修改产品的重量(字段类型为float),修改了产品的重量之后,是需要记录到日志表中的(字段类型为varchar),表结构如下:

临时刷数据表:


CREATE TABLE `temp_170830` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
 `goods_sn` varchar(255) NOT NULL DEFAULT '' COMMENT '产品编码',
 `goods_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT '产品重量',
 `actual_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT '实际重量',
 `new_actual_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT '新的实际重量',
 `create_user` varchar(30) NOT NULL DEFAULT '' COMMENT '创建人',
 PRIMARY KEY (`id`),
 KEY `idx_goods_sn` (`goods_sn`)
) ENGINE=InnoDB AUTO_INCREMENT=8192 DEFAULT CHARSET=utf8 COMMENT='临时刷重量表';

日志表:


CREATE TABLE `log_weight` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
 `goods_sn` varchar(50) NOT NULL DEFAULT '' COMMENT '产品编码',
 `which_col` varchar(100) NOT NULL DEFAULT '' COMMENT '修改字段',
 `old_value` varchar(50) NOT NULL DEFAULT '0.00' COMMENT '更新前值',
 `new_value` varchar(50) NOT NULL DEFAULT '0.00' COMMENT '更新后值',
 `update_user` varchar(100) NOT NULL DEFAULT '' COMMENT '创建人',
 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `wh_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录修改时间',
 PRIMARY KEY (`id`),
 KEY `idx_goods_sn` (`goods_sn`),
 KEY `idx_update_user` (`update_user`),
 KEY `wh_update_time` (`wh_update_time`)
) ENGINE=InnoDB AUTO_INCREMENT=14601620 DEFAULT CHARSET=utf8 COMMENT='重量修改日志';

如上面建的表所示,我需要将temp_170830表的actual_weight和new_actual_weight字段分别刷入log_weight表的old_value和new_value字段,SQL语句如下:


INSERT INTO log_weight(goods_sn, which_col, old_value, new_value, update_user)
SELECT goods_sn,'actual_weight',actual_weight,new_actual_weight,create_user FROM temp_170830;

本来以为到这里就已经大功告成了,毕竟只是插入一些日志记录,后来为了简单的进行核对,发现数据有些不对劲,如下图所示:

临时表数据截图:

日志表数据截图:

对比可以发现,插入的日志记录数据无缘无故后面多了很多位的小数,不知道从哪里冒出来的,后来一想,可能是本来浮点型的数据就是除不尽的,转成varchar的时候就把后面的那些也给带出来了,暂时也不是很确定,后续确定之后再补充,然后自己临时找了一个转varchar的方法concat,调整如下:


INSERT INTO log_weight(goods_sn, which_col, old_value, new_value, update_user)
SELECT goods_sn,'actual_weight',concat(actual_weight,''),concat(new_actual_weight,''),create_user FROM temp_170830;

顺利解决日志记录问题。

总结如下:

1 在记录价格和重量数字字段的时候,尽量不要使用浮点型!!!,浮点数坑多(比如浮点型是不能判断相等的!!!),最好是采用int整型,业务上要显示小数时,读取出来再除以相应的位数,比如99.98元,应存储9998,读取出来时,用9998/100来显示。

2 在float转varchar时,应该先把float用concat函数先转成varchar,再存储入varchar字段。

热心网友 时间:2022-04-13 02:51

浮点型转换为字符型一般需要计算的,比如现在浮点型是414.15f
转换为字符型,那么就需要将这串数据转换为ASCII码,单个数字单个数字转换:
定义一个缓冲区:char
Buffer[6]用于存放这几个数字;
接着:
将浮点型放大,转换为整型:(int)(414.15
*
100)
=
41415d
逐个取值:
for(i=0;i<6;i++)
{
41415
%
10
=
5
;
//求除以10的余数,从各位开始取值
10*10
=
100

//将除数放大10倍,一个循环后就编程了100,两个循环后是1000,以此求取各位上的数字;
Buffer[i]
=余数+'0';
//将各个位上的数字转化成字符型,存入缓冲区
}

热心网友 时间:2022-04-13 04:09

一、C语言中数值型数据分为两大类:整型和浮点型
整型:char
int
short
long
浮点型:float(单精度)
double(双精度)
二、浮点型数据转存到字符串中
char
str[30];
//定义一个字符数组,来存储数据
double
d=123.456;
//定义一个浮点型变量d
sprintf(str,"%f",
d
);
//格式串同printf()格式要求
sprintf(str,"%.2f",
d
);
//保留两位小数,第三位四舍五入
三、整型数据转存到字符串中
char
str[30];
int
i=123;
sprintf(str,
"%d",
i
);
四、0-9之间的数据转为字符
C语言中,字符型数据在存储时,实际上存储的是字符的ASCII值,字符'0'到'9'对应的ASCII是连续的,其值为48-57,所以,0-9数值转为字符时,只需要加上'0'就可以了,如:
char
ch;
int
i;
i=1;
ch=i+'0'
;
printf("ch=%c
ascii=%d",
ch,
ch
);
//按%c输出,就是字符1,按%d输出就是ASCII值49
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
油性头发如果不天天洗头怎样才可以看起来不油呢? 怎样才能改善油性发质? 油性头发去油的窍门有什么? 木炭烧烤炉内堂深多少 ...钱2013年买的没有拉过货就是上下班开开开了23000公里成 贵人果海棠的养殖方法和注意事项新种 军训鉴定意见评语 军训评语怎么写? 电脑开机出现Nobootabledevicesfound 电脑开机出现no bootable devices found是什么意思? 急诊科实习生自我鉴定表 小米手机自己播放音乐找不到界面 800米跑步时要注意什么 骂人是糯米鸡,是什么意思 供出马堂是找师傅写名还是弟子自己能报名 在急诊实习是一种什么样的体验? 没出马之前能帮师傅做事吗? 什么是糯米鸡呀? 有仙缘未出马的弟子,可以和己出马的师傅办事吗? 糯米鸡的制做方法是什么? - 信息提示 800米跑步应该注意什么 传统糯米鸡的做法是什么? 你好师兄,怎么才知道自己能不能出马? 糯米鸡配什么喝的 不找领堂师傅自己能出道吗? 出马看病,自己出还是有师父指导 生姜擦睫毛的正确方法 祖辈留下保家仙要出马需要师傅吗 生姜可以长睫毛吗 分布式和负载均衡的区别 nginx负载均衡搭建两台服务器,一台挂起,另一台正常开启,但是打不开网页,显示404报错 找有朝气蓬勃青春气息的散文 谁能给我推荐几篇写现代学习生活的,具有青春气息的散文? 定州哪家银行有结构性存款? 微信青少年模式申请重置是谁申请 win10应用商店的安装包怎么删除 怎么重新设置一个? win10应用商店安装包怎么安装 实验小学的—处景物作文300字 我注销了,然后再重新申请一个,我可以重新设置微信账号回原来注销的那账号吗? 梦见我带着家人去坟墓摘菜,坟墓都叫了想捉我们 我的学校实验小学的作文怎么写三年级 vivo(v3)手机怎么重新申请 梦见坟墓边上种菜摘菜 我社保卡输错密码。超过三次。下月的,社保金还能转进去吗? 华龙区实验小学的变化作文300字 梦见和小男孩在坟地里捡东西吃 广州 社保卡输错三次 win10怎么装应用应用商店