小数类型分类
MySQL 提供三种小数类型来表示非整数值:
类型名称 | 说明 | 存储需求 | 特点 |
---|---|---|---|
FLOAT | 单精度浮点数 | 4字节 | 近似值存储,范围大但可能有精度损失 |
DOUBLE | 双精度浮点数 | 8字节 | 比FLOAT更高精度的近似值存储 |
DECIMAL | 精确的定点数 | M+2字节(M为精度) | 精确存储,以字符串形式保存,适合财务等需要精确计算的场景 |
精度表示方式
M (精度):总位数(整数+小数部分)
D (标度):小数位数
格式:(M, D)
FLOAT(7,4):共7位,其中4位小数
DECIMAL(10,2):共10位,其中2位小数
取值范围对比
FLOAT
有符号:±3.402823466E+38 ~ ±1.175494351E-38
无符号:0 和 1.175494351E-38 ~ 3.402823466E+38
DOUBLE
有符号:±1.7976931348623157E+308 ~ ±2.2250738585072014E-308
无符号:0 和 2.2250738585072014E-308 ~ 1.7976931348623157E+308
关键特性
1. 默认值:
FLOAT/DOUBLE:不指定精度时使用硬件支持的最大精度
DECIMAL:默认DECIMAL(10,0)
2.存储方式:
浮点数(FLOAT/DOUBLE):近似值存储,可能有精度损失
定点数(DECIMAL):精确存储,以字符串形式保存
3.精度处理:
超出指定精度时会四舍五入
DECIMAL的有效范围随M增大而扩大
使用建议
1.选择原则:
需要精确计算(如财务数据):使用DECIMAL
需要大范围数值且可接受近似值:使用FLOAT/DOUBLE
一般科学计算:DOUBLE
节省空间且范围足够:FLOAT
2.注意事项:
避免用浮点数进行等值比较(可能因精度问题出错)
浮点数运算(特别是减法)可能导致意外结果
DECIMAL会占用更多存储空间但保证精度
3.性能考虑:
浮点运算通常比DECIMAL运算快
DECIMAL的精确性是以牺牲性能为代价的
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程