MySQL中FLOAT(20,15)类型定义精度与实际存储不符问题咨询
为什么MySQL中FLOAT(20,15)无法达到定义的小数精度?
核心原因
MySQL的FLOAT是单精度浮点数类型,其精度由底层存储机制决定,和你定义的(M,D)参数无关:
- 单精度浮点数用32位存储,仅能提供6-7位有效十进制数字(整数+小数部分的总有效位数),超出这个范围的数值会被四舍五入,无法精确存储。
FLOAT(M,D)中的M(总位数)和D(小数位数)仅用于插入时的格式校验和显示格式化,不能突破FLOAT本身的精度上限。你定义的D=15只是限制插入时最多输入15位小数,但存储时依然会按照FLOAT的固有精度截断。
解决方案
如果需要精确存储15位小数的数值,应使用**DECIMAL(M,D)**类型,这是专门的精确十进制存储类型,会严格按照你定义的位数存储数值,不会丢失精度。修改表结构如下:
create table Geolocation ( LATITUDE decimal(20, 15) not null, LONGITUDE decimal(20, 15) not null) comment 'geolocation' charset = utf8mb4;
插入你提供的数值后,就能得到预期的精确存储结果。
问题重现代码
create table Geolocation ( LATITUDE float(20, 15) not null, LONGITUDE float(20, 15) not null) comment 'geolocation' charset = utf8mb4; INSERT INTO Geolocation VALUES('15.6517291','120.973719'); INSERT INTO Geolocation VALUES('15.651729123','120.973719123412');
实际存储结果
15.651729,120.97372 15.65173,120.97372
预期结果
15.6517291, 120.973719 15.651729123, 120.973719123412
内容的提问来源于stack exchange,提问作者haedoang
相关产品推荐
相关产品推荐

