mysql:列类型之float、double

mysql:列类型之float、double_mysql double_普通网友的博客-CSDN博客

环境:

window10

vs2022

.net 6

mysql 8.0.25

DBeaver

参考:

《MSDN:浮点数值类型(C# 引用)》

《mysql:11.1.4 Floating-Point Types (Approximate Value) - FLOAT, DOUBLE》

  1. float和double类型

在mysql中,float和double都是浮点数类型:

float 占4个字节,精度是6位;

double 占8个字节,精度是16位;

它们的性质和c#中浮点数的性质是一样的,只不过精度要求的更严格和明确一些;

参照:c#中浮点型的精度要求为在这里插入图片描述

测试mysql中的float和double:

create table test(

t_float float,

t_double double

)

insert into test.test (t_float) values(123456);-- 正常

insert into test.test (t_float) values(1234567);-- 四设五入 1234570

insert into test.test (t_float) values(12345678901);-- 失真 12345700352

insert into test.test (t_float) values(12345.6); -- 正常

insert into test.test (t_float) values(12345.62); -- 四设五入 12345.6

insert into test.test (t_float) values(123.123); -- 正常

insert into test.test (t_float) values(12.1234); -- 正常

insert into test.test (t_float) values(1.12345); -- 正常

insert into test.test (t_float) values(1234.1234); -- 四设五入 1234.12

-- double

insert into test.test (t_double) values(1234567890123456);-- 正常

insert into test.test (t_double) values(12345678901234567);-- 四设五入 12345678901234568

insert into test.test (t_double) values(123.12345678901);-- 正常

insert into test.test (t_double) values(1234567890.123456);-- 正常

select * from test

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

输出如下:

在这里插入图片描述

我们可以认为是这样的:

当我们把数据插入float类型时,mysql会优先保留6位有效数字,对右侧的数字进行四舍五入;

当我们把数据插入double类型时,mysql会优先保留16位有效数字,对右侧的数字进行四设五入;

注意:mysql不会因为数据超范围而报错,比如:12345678901远超精度,但它只会数据失真并不会报错。

  1. float和double语法

推荐的使用方法是:t_float float、t_double double,即:不添加其他参数。

但为了兼容sql标准,mysql中提供:float(p)这种写法,这里的p取值范围是:[0,53],超过范围会报错,另外:这里的p仅用来决定mysql内部采用float还是double存储,当p∈[0,23] 时,mysql采用float存储,当p∈[24,53]时,mysql采用double存储。

  1. float和double的非推荐用法

上面说的是推荐用法,在推荐用法中mysql的float和c#的float行为表现基本一致。

还有非标准用法,比如:float(M,D),不过这种写法即将被弃用了。

虽然是被弃用,但它好像也并非一无是处:

float(M,D)中的M表示总有效数字,D表示小数位数。这有点像decimal(M,D)的M和D。

如果我们定义:float(5,2)的话,就表示:小数点后最大2位,小数点前最大3位,小数点前超过3位将报错,小数点后超过2位将四舍五入;

测试如下:

create table test(

t_float5_2 float(5,2)

)

insert into test.test (t_float5_2) values(123.12);-- 正常

insert into test.test (t_float5_2) values(1234.1);-- 报错: Out of range value

insert into test.test (t_float5_2) values(1.1234);-- 四设五入 1.12

select * from test

1

2

3

4

5

6

7

8

9

输出如下:

在这里插入图片描述

可以看到这种非标准用法限制更严格一点,不过因为它即将被启用,不做过多探索。

另外,double类型没有非标准的 double(M,D) 写法!

另外,除了float(M,D)还有real(M,D)和double precision(M,D)。

这里总结下它们的用法和区别:

在这里插入图片描述

  1. c#中使用方式

由于mysql中的float和double都是浮点型数据,基本和c#中的float和double一一对应,所以在c#中我们完全可以使用float和double分别去替代,但一般我们在c#中会统一使用double,如下:

public class Model

{

public double? t_float { get; set; }

public double? t_double { get; set; }

}

1

2

3

4

5

  1. 最后看下它们的元数据

create table test(

t_float float,

t_float7 float(7),

t_float10 float(10),

t_float35 float(35),

t_float40 float(40),

t_double double,

-- t_double double(5), -- 报错

t_float7_5 float(7,5), -- 弃用

t_real real,

t_real7_5 real(7,5),

t_double_precision8_5 double precision(8,5)

)

select c.TABLE_SCHEMA ,c.TABLE_NAME ,c.COLUMN_NAME ,c.ORDINAL_POSITION,c.DATA_TYPE,c.NUMERIC_PRECISION ,c.COLUMN_TYPE ,c.NUMERIC_SCALE

from information_schema.`COLUMNS` c where TABLE_SCHEMA ='test' and TABLE_NAME ='test' order by ORDINAL_POSITION

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

在这里插入图片描述

最后

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。


版权声明:本文为CSDN博主「普通网友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/m0_67392661/article/details/126803834

相关推荐
专注API从业者7 分钟前
基于 Flink 的淘宝实时数据管道设计:商品详情流式处理与异构存储
大数据·前端·数据库·数据挖掘·flink
小猿姐1 小时前
KubeBlocks for Milvus 揭秘
数据库·云原生
AI 嗯啦1 小时前
SQL详细语法教程(四)约束和多表查询
数据库·人工智能·sql
杜子不疼.1 小时前
《Python学习之文件操作:从入门到精通》
数据库·python·学习
TDengine (老段)2 小时前
TDengine IDMP 高级功能(4. 元素引用)
大数据·数据库·人工智能·物联网·数据分析·时序数据库·tdengine
DashVector2 小时前
如何通过Java SDK分组检索Doc
java·数据库·面试
Olrookie3 小时前
XXL-JOB GLUE模式动态数据源实践:Spring AOP + MyBatis 解耦多库查询
java·数据库·spring boot
苏婳6663 小时前
【最新版】怎么下载mysqlclient并成功安装?
数据库·python·mysql
Tapdata5 小时前
《实时分析市场报告 2025》上线 | 从批处理到实时洞察,2025 年全球实时分析市场全景解读
数据库
海梨花5 小时前
【从零开始学习Redis】项目实战-黑马点评D2
java·数据库·redis·后端·缓存