mysql:列类型之float、double_mysql float-程序员宅基地

技术标签: database  c# .net  mysql  数据库  

环境:

  • 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

输出如下:
在这里插入图片描述

我们可以认为是这样的:
当我们把数据插入float类型时,mysql会优先保留6位有效数字,对右侧的数字进行四舍五入;
当我们把数据插入double类型时,mysql会优先保留16位有效数字,对右侧的数字进行四设五入;

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

2. float和double语法

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

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

3. 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

输出如下:
在这里插入图片描述

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

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

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

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

在这里插入图片描述

4. 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; }
}

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

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 

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010476739/article/details/122879976

智能推荐

加密解密(三)--Java中的非对称加密算法_publickey.getencoded()多出一部分-程序员宅基地

文章浏览阅读911次。非对称加密算法是一种密钥的保密方法。非对称加密算法需要两个密钥:公开密钥(public key)和私有密钥(private key)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程_publickey.getencoded()多出一部分

通往未来的数字大道:解读政府工作报告中的计算机行业发展路径-程序员宅基地

文章浏览阅读539次,点赞15次,收藏10次。政府工作报告作为政府工作的全面总结和未来规划,不仅反映了国家整体的发展态势,也为各行各业提供了发展的指引和参考。随着信息技术的快速发展,计算机行业已经成为推动经济社会发展的重要引擎之一。因此,从政府工作报告中探寻计算机行业的发展趋势、政策导向和未来机遇,对于行业内的企业和从业者来说具有重要的指导意义。

SSL编程指南_sslv23-程序员宅基地

文章浏览阅读1.3w次,点赞16次,收藏83次。本文将介绍如何使用openssl APIs 实现一个简单的SSL 客户端和服务端虽然SSL客户端和服务端在创建和配置上有所区别,但它们本质上的步骤可以总结为如下图,具体步骤将在后面章节介绍:初始化SSL库在SSL应用程序中调用其他Openssl APIs,需要先用下面的APIs进行初始化:SSL_library_init(); /* 为SSL加载加密和哈希算法 */_sslv23

Java笔记5.0-程序员宅基地

文章浏览阅读75次。if条件结构基本if条件结构if(条件){}注意:当if关键词后的一对大括号里只有一个语句时,可以省略大括号。2.多重复if条件结构if(条件1){}else if(条件2){}else{}应用于只有一个if条件不能解决的问题,可以将问题的条件更详细地表示。3.嵌套if条件结构嵌套if选择结构就是在if里嵌入if选择结构,如下if(条件){if(条件){代码...

Paul Graham:未来的互联网创业(上)-程序员宅基地

文章浏览阅读63次。根据Paul Graham的简历,他是一个计算机博士,一个程序员,一个风险投资家。 ...

C#入门5.7——迭代语句之foreach语句_c# 中迭代变量 与集合变量-程序员宅基地

文章浏览阅读372次。foreach提供了一个for语句的捷径,而且还促进了集合类更为一致。格式foreach(类型 变量 in 集合) //注意集合二字。{代码体}补充:string类型可以看成是char类型的一个集合新语句char.IsWhiteSpace(c) //判断c是否为空格例子:将语句识别为单词并逐行输出using System;using Syst_c# 中迭代变量 与集合变量

随便推点

vue项目中的登录功能实现_trottle(_wxmnplogin, 1000)-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏14次。今天找了个开源的vue项目,要在此基础上改动,刚看到登录功能,封装的挺好,记录下,顺便捋捋思路,方便以后使用1、界面部分,就正常的登录界面,把重点的代码贴上(红色箭头是登录事件)2、js部分:输入用户名和密码,点击登录按钮后,触发this.throttleLogin方法,在此设置了一个节流函数throttle,此函数参数主要为调用的函数方法以及规定时间内仅触发一次。节流函数3、调用了this.login方法,在此方法中,将api请求封装到单独的模块中,该vue页面引用..._trottle(_wxmnplogin, 1000)

Visio首要事项闪退-程序员宅基地

文章浏览阅读2.5w次,点赞36次,收藏25次。网上有很多首要事项三个选项无论怎么选都直接闪退的情况,我自己遇到后瞎捣鼓解决了,把方法发出来给后来者借鉴。1、在设置-应用中找到Visio,应该叫“Microsoft Visio Professional 2013”。2、单击右边三个小点,选择“修改”。3、选“输入产品密钥”。4、复制这个失效密钥 27W4Q-T9N3J-JWX46-M7K96-GMQ73 并输入。5、因为已经安装过了就不需要自定义,所以选择继续、继续就行。6、提示重启系统,直接叉掉,没有修改安装文件没必要重启。.._首要事项

Java 设计模式 - Builder_java builder设计模式-程序员宅基地

文章浏览阅读137次。Java Design Partterns - Builder_java builder设计模式

[源码和文档分享]基于C++实现的LZW压缩算法-程序员宅基地

文章浏览阅读53次。1 特点 基于C++实现的LZW压缩算法,特点如下所示: 使用stl::map键值对作为字典存储 感觉算是简单的文件操作 字典无限长,字典自生长。但是字典只能解析存储ascii编码之类存在,中文符号之类的碰到就挂 2 逻辑设计 2.1 总体思路 ..._c++基于字典的无压缩算法lzw和lz77

自己动手编程实现“电子地图下载器_地图下载器实现原理-程序员宅基地

文章浏览阅读2.1k次,点赞3次,收藏3次。自己动手编程实现“电子地图下载器”请联系本文作者(QQ:442134556)获取源码电子地图对于国土规划、交通运输、水利设计、农林地质等部门的测绘、测量专业设计人员至关重要。国内已有一些公司提供下载软件,如迈高图(megomap)地图下载器、水经注(rivermap)万能地图下载器、BIGEMAP地图下载器、全能电子地图下载器等。这些软件的使用费从几百元到几千元不等。其实,绝大部分地理信息图..._地图下载器实现原理

HN8145X6/HS8145X6安装虚拟机OpenWRT-程序员宅基地

文章浏览阅读927次。(5)21.02.2版本和电信插件管理平台不兼容,电信平台起不来,所有的库都在原来的地方,但是ldd appmgr会报告一堆relocation。(1)125版以上固件的tar是残废的,不能正确解析跨目录的软链接,需要自行另外找版本;(2)默认network服务是关闭的,不要随意乱配和启动,可能会挂掉,特别是CPU口eth0,挂了用上面的软链接方法恢复,要拼手速。(3)默认防火墙firewall服务也是关闭的,,不要随意乱配和启动,可能网络会挂掉连不上,挂了用上面的软链接方法恢复,要拼手速。_hn8145x6