基本数据类型:

为什么明确数据类型?不同数据类型大小不同。明确了数据类型之后,可以帮助使用者进行类型检查,明确存储空间大小,明确操作是否合理。从手册上来看,基本的数据类型包括:日期与时间(05.27.2020)/字符串(abcd)/空间数据/JSON数据/数值 (最简单的类似数字1,2,3)

今天来重点讲一下数值数据类型中的浮点




mysql 计算结果为0精度丢失 mysql double 精度_比double精度更高的数据类型


-浮点


mysql 计算结果为0精度丢失 mysql double 精度_MySQL_02

整数部分 4 小数点(.)小数部分


mysql 计算结果为0精度丢失 mysql double 精度_比double精度更高的数据类型_03

小数点第一位 7 小数点第二位 4 小数点第三位 3

浮点有两类,一种是decimal. Fixed-point types,存储准确值的。需要指定位数

一种是float and double .Floating-Point Types 近似值。不需要指定位数


先来看Decimal

MySQL以二进制格式存储DECIMAL值。在DECIMAL列声明中,可以(通常是)指定精度和小数位数。例如:薪水DECIMAL(5,2)在此示例中,5是精度,2是小数位。精度表示值存储的有效位数,小数位数表示小数点后可存储的位数。

标准SQL要求DECIMAL(5,2)能够存储任何具有五位数字和两位小数的值,因此可以存储在薪水列中的值的范围是-999.99到999.99。

在标准SQL中,语法DECIMAL(M)等效于DECIMAL(M,0)。同样,语法DECIMAL等效于DECIMAL(M,0),其中允许实现决定M的值。MySQL支持DECIMAL语法的这两种变体形式。 M的默认值为10。

如果小数位数为0,则DECIMAL值不包含小数点或小数部分。DECIMAL的最大位数为65,但是给定DECIMAL列的实际范围可能受给定列的精度或小数位数的限制。如果为这样的列分配的值在小数点后的位数比指定刻度允许的位数多,则该值将转换为该刻度。 (精确的行为是特定于操作系统的,但是通常效果是将其截断为允许的位数。


再来,Float(M,D) Double Precision(M,D):M 总共有多少位,D 小数点后有多少位。

MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。在此,(M,D)表示总共可以存储多达M位的值,其中D位可以在小数点后。例如,显示为FLOAT(7,4)的列看起来像-999.9999。 MySQL在存储值时执行四舍五入,因此,如果将999.00009插入FLOAT(7,4)列,则近似结果为999.0001。

看了文档,发现从MySQL 8.0.17开始,不建议使用非标准的FLOAT(M,D)和DOUBLE(M,D)语法,并且在将来的MySQL版本中将不再支持该语法

由于浮点值是近似值而不是作为精确值存储的,因此在比较中尝试将它们视为精确值可能会导致问题。在实际运算过程中,输入相同的数字进行加和运算,因为数据类型的不同,最后的结果可能不同。所以,要认真考虑数据的类型。特别是对数字精度敏感的行业。

需要注意的是:存储近似数值数据值的代码应使用FLOAT或DOUBLE PRECISION,而没有规定精度或位数。

SQL标准允许在括号中的关键字FLOAT后面的位中指定精度(而不是指数的范围)的可选规范 ;即FLOAT(p)。 MySQL还支持此可选的精度规范,但是精度值仅用于确定存储大小。从0到23的精度生成4字节单精度FLOAT列。从24到53的精度将生成8字节的双精度DOUBLE列。

(MySQL uses four bytes for single-precision values and eight bytes for double-precision values.---- from MySQL Notes)


mysql 计算结果为0精度丢失 mysql double 精度_mysql 计算结果为0精度丢失_04



代码运行 (MySQL)

create table t3 (d1 decimal(5,2),d2 double(5,2),d3 float(5,3),d4 double, d5 float,d6 decimal)

insert into t3

values

(23.432,23.432,23.432,23.432,23.432,23.432)

select * from t3;

运行结果:

23.43(后面变成两位小数) 23.43(后面变成两位小数)23.432 (浮点,后面三位)23.432(double 不变),23.432(float 不变),23 (decimal 没有设定小数点,直接没有小数点后面的数值了)

之后继续介绍其他数值类型

推荐几个介绍数据类型的网站。


mysql 计算结果为0精度丢失 mysql double 精度_数据类型_05

MySQL Data Types - w3resourcewww.w3resource.com

mysql 计算结果为0精度丢失 mysql double 精度_mysql 计算结果为0精度丢失_06