MySQL的float数据类型注意
来源:互联网 发布:杨氏弹性模量数据ed 编辑:程序博客网 时间:2024/06/07 06:00
摘要:
公司项目数据库中存储金额字段使用float类型,在金额达到10W时出现小数丢失,部分数据四舍五入的问题,将数据类型替换为DECIMAL后解决该问题。主要原因就是原来人员没有搞清楚float的使用陷阱和使用场景,以下内容就是自己查找部分同学的资料后实验所得。
MySQL官方文档
FLOAT[(M[, D])]数据类型是单精度浮点数, 默认大小为24位数字,精度大约7位数字(经测试为6位),当设置M大小大于24时,自动转换为DOUBLE类型;同时设置M和D时不进行自动转换。
测试实验1
mysql > create table float_test(id int, float_test float);mysql > desc float_test;+------------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+------------+---------+------+-----+---------+-------+| id | int(11) | YES | | NULL | || float_test | float | YES | | NULL | |+------------+---------+------+-----+---------+-------+mysql > insert into float_test values(1, 123456),(2, 123.456),(3, 1234567),(4,1234.5678);mysql > select * from float_test;+------+------------+| id | float_test |+------+------------+| 1 | 123456 || 2 | 123.456 || 3 | 123570 || 4 | 1234.57 |+------+------------+
从上面测试代码可知float默认保存6位精度(包括小数位和整数位),超过6位会被四舍五入并补入0.
测试实验2
mysql > alter table float_test add float_4 float(4);mysql > desc float_test;+------------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+------------+---------+------+-----+---------+-------+| id | int(11) | YES | | NULL | || float_test | float | YES | | NULL | || float_4 | float | YES | | NULL | |+------------+---------+------+-----+---------+-------+
由数据表结构来看,float(m)是没有效果的,和float效果一致(根据文档m<24时相当于24).
测试实验3
mysql > alter table float_test add float_4_2 float(4,2);mysql > desc float_test;+------------+------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+------------+------------+------+-----+---------+-------+| id | int(11) | YES | | NULL | || float_test | float | YES | | NULL | || float_4 | float | YES | | NULL | || float_4_2 | float(4,2) | YES | | NULL | |+------------+------------+------+-----+---------+-------+mysql > insert into float_test(id,float_4_2) values(5, 12),(6, 12.4), (7, 12.34);(填写其他整数部分位数大于2的均会报错,但使用ORM框架不会报错)mysql > select * from float_test where id > 4;+------+------------+---------+-----------+| id | float_test | float_4 | float_4_2 |+------+------------+---------+-----------+| 5 | NULL | NULL | 12.00 || 6 | NULL | NULL | 12.40 || 7 | NULL | NULL | 12.34 |+------+------------+---------+-----------+mysql > update float_test set float_4_2=12.3456 where id = 5;mysql> select * from float_test where id > 4+------+------------+---------+-----------+| id | float_test | float_4 | float_4_2 |+------+------------+---------+-----------+| 5 | NULL | NULL | 12.35 || 6 | NULL | NULL | 12.40 || 7 | NULL | NULL | 12.34 |+------+------------+---------+-----------+
由上可知,设置m和d是有效果的,小数不够位补0;当小数位多时进行四舍五入.
测试实验4
mysql> alter table float_test add float_25 float(25);mysql> desc float_test;+------------+------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+------------+------------+------+-----+---------+-------+| id | int(11) | YES | | NULL | || float_test | float | YES | | NULL | || float_4 | float | YES | | NULL | || float_4_2 | float(4,2) | YES | | NULL | || float_25 | double | YES | | NULL | |+------------+------------+------+-----+---------+-------+
当m大于24时,数据类型转换为double类型.
测试实验5
mysql> alter table float_test add float25_2 float(25,2);mysql> desc float_test;+------------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+------------+-------------+------+-----+---------+-------+| id | int(11) | YES | | NULL | || float_test | float | YES | | NULL | || float_4 | float | YES | | NULL | || float_4_2 | float(4,2) | YES | | NULL | || float_25 | double | YES | | NULL | || float25_2 | float(25,2) | YES | | NULL | |+------------+-------------+------+-----+---------+-------+mysql> insert into float_test(id, float25_2) values(8, 12345678901234567890123.12);mysql> select * from float_test where id > 7;+------+------------+---------+-----------+----------+----------------------------+| id | float_test | float_4 | float_4_2 | float_25 | float25_2 |+------+------------+---------+-----------+----------+----------------------------+| 8 | NULL | NULL | NULL | NULL | 12345679377913908000000.00 |+------+------------+---------+-----------+----------+----------------------------+
有由上可知,当m和d同时设置时,尽管m大于24,但是不会进行转换;同时数值还会变得不准确,小数位被0填充。
注:
float的d最大限制不能超过30
0 0
- MySQL的float数据类型注意
- MySQL数据库float数据类型
- Mysql数据类型---FLOAT
- 关于MySQL数据类型的一些注意问题
- ORACLE的数据类型float
- mysql进阶(十)不靠谱的FLOAT数据类型
- mysql数据类型 int、tinyint、float与decimal的区别
- mysql float数据类型和decimal数据类型
- Oracle的数据类型float(b)
- Oracle的数据类型float(b)
- Java `float` 数据类型的解说
- MySQL float,double,decimal数据类型区别
- mysql float 的问题
- 注意,float和double的精度
- 定义数据类型时float double的使用
- mysql 数据类型 date 和 datetime 注意
- MySQL float 类型的精度
- MySQL float 类型的精度
- java 接口回调机制
- 使用JMeter做压力测试
- 创建虚拟运行环境及多版本python切换
- android BaseActivity与BaseFragment的封装
- js 动态显示时间(setTimeout)
- MySQL的float数据类型注意
- C++模板实现简单的链表和顺序表
- java 使用Jsoup解析URL网页信息
- web 项目访问D盘中的图片文件(tomcat配置虚拟目录)
- 微信实验七、微信PHP开发调试技巧及源码下载
- js 静态方法与实例方法
- 文章标题
- Oracel相关
- EasyUI Combobox获得焦点的使用方法