You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:32:47