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

相关推荐
Musennn17 分钟前
MySQL刷题相关简单语法集合
数据库·mysql
Think Spatial 空间思维1 小时前
【HTTPS基础概念与原理】TLS握手过程详解
数据库·网络协议·https
逝水如流年轻往返染尘1 小时前
MySQL表的增删查改
mysql
laowangpython1 小时前
MySQL基础面试通关秘籍(附高频考点解析)
数据库·mysql·其他·面试
mooyuan天天2 小时前
SQL注入报错“Illegal mix of collations for operation ‘UNION‘”解决办法
数据库·web安全·sql注入·dvwa靶场·sql报错
运维-大白同学2 小时前
go-数据库基本操作
开发语言·数据库·golang
R-sz2 小时前
通过从数据库加载MinIO配置并初始化MinioClient,spring boot之Minio上传
数据库·oracle
洛阳泰山2 小时前
Windows系统部署MongoDB数据库图文教程
数据库·windows·mongodb
医只鸡腿子3 小时前
3.2/Q2,Charls最新文章解读
数据库·数据挖掘·数据分析·深度优先·数据库开发
bang___bang_3 小时前
PostgreSQL内幕剖析——结构与架构
数据库·postgresql