【mysql】定点类型

举报
兮动人 发表于 2022/03/06 10:26:17 2022/03/06
【摘要】 定点数类型 1. 类型介绍MySQL中的定点数类型只有 DECIMAL 一种类型。数据类型字节数含义DECIMAL(M,D),DEC,NUMERICM+2字节有效范围由M和D决定使用 DECIMAL(M,D) 的方式表示高精度小数。其中,M被称为精度,D被称为标度。0<=M<=65,0<=D<=30,D<M。例如,定义DECIMAL(5,2)的类型,表示该列取值范围是-999.99~999...

定点数类型

1. 类型介绍

  • MySQL中的定点数类型只有 DECIMAL 一种类型。

    数据类型 字节数 含义
    DECIMAL(M,D),DEC,NUMERIC M+2字节 有效范围由M和D决定
  • 使用 DECIMAL(M,D) 的方式表示高精度小数。其中,M被称为精度,D被称为标度。0<=M<=650<=D<=30D<M。例如,定义DECIMAL(5,2)的类型,表示该列取值范围是-999.99~999.99

  • DECIMAL(M,D)的最大取值范围与DOUBLE类型一样,但是有效的数据范围是由MD决定的。DECIMAL 的存储空间并不是固定的,由精度值M决定,总共占用的存储空间为M+2个字节。也就是说,在一些对精度要求不高的场景下,比起占用同样字节长度的定点数,浮点数表达的数值范围可以更大一些。

  • 定点数在MySQL内部是以字符串的形式进行存储,这就决定了它一定是精准的。

  • DECIMAL类型不指定精度和标度时,其默认为DECIMAL(10,0),表示有10个整数位,0个小数位,其范围:-9999999999~9999999999。当数据的精度超出了定点数类型的精度范围时,则MySQL同样会进行四舍五入处理。

2. 浮点数 vs 定点数

  • 浮点数相对于定点数的优点是在长度一定的情况下,浮点类型取值范围大,但是不精准,适用于需要取值范围大,又可以容忍微小误差的科学计算场景(比如计算化学、分子建模、流体动力学等)

  • 定点数类型取值范围相对小,但是精准,没有误差,适合于对精度要求极高的场景 (比如涉及金额计算的场景)

  • 举例说明

CREATE TABLE test_decimal1(
f1 DECIMAL,
f2 DECIMAL(5,2)
);

DESC test_decimal1;

在这里插入图片描述

  • 存在 四舍五入
INSERT INTO test_decimal1(f1,f2)
VALUES(123.123,123.456);
  • f1(10,0) 表示无小数位,所以显示 123
    在这里插入图片描述

  • 超出范围,报错。因为f2 DECIMAL(5,2),得知整数位是3,小数位是2,下面的整数位超出后就会报错。

#Out of range value for column 'f2' at row 1
INSERT INTO test_decimal1(f2)
VALUES(1234.34);

在这里插入图片描述

INSERT INTO test_decimal1(f2)
VALUES(999.99);

在这里插入图片描述

  • 注意:整数位超出范围会直接报错,小数位超出范围会四舍五入

案例演示

  • 浮点类型是不精确的
CREATE TABLE test_double2(
f1 DOUBLE
);

INSERT INTO test_double2
VALUES(0.47),(0.44),(0.19);

SELECT SUM(f1)
FROM test_double2;

按理说:0.47+0.44+0.19 = 1.1
在这里插入图片描述

SELECT SUM(f1) = 1.1,1.1 = 1.1
FROM test_double2;

在这里插入图片描述

在这里插入图片描述

test_double2表中字段“f1”的数据类型修改为 DECIMAL(5,2)

ALTER TABLE test_double2
MODIFY f1 DECIMAL(5,2);

DESC test_double2;

在这里插入图片描述

然后,再一次运行求和语句:

mysql> SELECT SUM(f1)
    -> FROM test_double2;
+---------+
| SUM(f1) |
+---------+
|    1.10 |
+---------+
1 row in set (0.00 sec)
mysql> SELECT SUM(f1) = 1.1
    -> FROM test_double2;
+---------------+
| SUM(f1) = 1.1 |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)
SELECT SUM(f1) = 1.1,1.1 = 1.1
FROM test_double2;

结果为 1 ,说明是 正确的
在这里插入图片描述

3. 开发中经验

  • 由于 DECIMAL 数据类型的精准性,在项目中,除了极少数(比如商品编号)用到整数类型外,其他的数值都用的是 DECIMAL,原因就是这个项目所处的零售行业,要求精准。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。