MySQL中的float、double和decimal类型

本文详细探讨了MySQL中的float和decimal类型的区别及使用场景,包括精度、标度、存储方式和数据迁移注意事项。重点介绍了decimal类型在处理货币数据时的精确性和优势,以及如何正确使用decimal(M,D)避免误差问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL中的float和decimal类型
 
float,double容易产生误差,对精确度要求比较高时,建议使用decimal来存,decimal在 mysql内存是以字符串存储的,用于定义货币要求精确度高的数据。在数据迁移中,float(M,D)是非标准定义,最好不要这样使用。M为精度,D为标度。 
 
mysql> create table t1(c1 float(10,2), c3 decimal(10,2)); 
Query OK, 0 rows affected (0.02 sec) 
 
mysql> insert into t1 values(1234567.23, 1234567.23); 
Query OK, 1 row affected (0.01 sec) 
 
mysql> select * from t1; 
+------------+------------+ 
| c1 | c3 | 
+------------+------------+ 
| 1234567.25 | 1234567.23 | 
+------------+------------+ 
1 row in set (0.02 sec) 
 
mysql> insert into t1 values(9876543.21, 9876543.12); 
Query OK, 1 row affected (0.00 sec) 
 
mysql> 
mysql> select * from t1; 
+------------+------------+ 
| c1 | c3 | 
+------------+------------+ 
| 1234567.25 | 1234567.23 | 
| 9876543.00 | 9876543.12 | 
+------------+------------+ 
2 rows in set (0.00 sec) 
 
不定义fload, double的精度和标度时,存储按给出的数值存储,这于OS和当前的硬件有关。 
 
decimal默认为decimal(10,0) 
 
因为误差问题,在程序中,少用浮点数做=比较,可以做range比较。如果数值比较,最好使用decimal类型。 
 
精度中,符号不算在内: 
 
 
mysql> insert into t1 values(-98765430.21, -98765430.12); 
Query OK, 1 row affected (0.01 sec) 
 
mysql> select * from t1; 
+--------------+--------------+ 
| c1 | c3 | 
+--------------+--------------+ 
| 1234567.25 | 1234567.23 | 
| 9876543.00 | 9876543.12 | 
| -98765432.00 | -98765430.12 | 
+--------------+--------------+ 
3 rows in set (0.00 sec) 
 
float占4个字节,double占8个字节,decimail(M,D)占M+2个字节。 
 
decimal 类型可以精确地表示非常大或非常精确的小数。大至 1028(正或负)以及有效位数多达 28 位的数字可以作为 decimal类型存储而不失其精确性。该类型对于必须避免舍入错误的应用程序(如记账)很有用。   www.2cto.com  
 
float是浮点数,不能指定小数位。 
decimal是精确数,可以指定精度。 
对mysql 5来说 decimal(p,s)中p最大为65,S最大为30 
decimal数据类型最多可存储 38 个数字,它存储了一个准确(精确)的数字表达法,不存储值的近似值。 
 
当数据值一定要按照指定精确存储时,可以用带有小数的decimal数据类型来存储数字。 
float和real数据类型被称为近似的数据类型。不存储精确值.当要求精确的数字状态时,比如在财务应用程序中,在那些需要舍入的操作中,或在等值核对的操作中,就不使用这些数据类型。这时就要用integer、decimal、money或smallmone数据类型。 
 
在 WHERE 子句搜索条件中(特别是 = 和 <> 运算符),应避免使用float或real列。最好限制使用float和real列做> 或 < 的比较。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴国进

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值