MySQL 小数类型介绍

文章目录

    • 前言
      • 1. 浮点类型
        • 1.1 数值精度说明
        • 1.2 整数超出范围
        • 1.3 小数超出范围
        • 1.4 精度误差说明
      • 2. 定点类型
        • 2.1 数值精度说明
        • 2.2 整数超出范围
        • 2.3 小数超出范围
    • 总结

前言

对于保证精度的数字,MySQL 也有对应的小数类型,下图是 MySQL 中小数类型概览。
请添加图片描述

  • 浮点:小数点非固定的数,可表示数据范围较广,整数,小数都可表示。

  • 定点:小数点固定,可表示整数,小数。int(整数)本质是小数点位于末尾的 32 位定点数而已。

    -- 建表
    create table test_1(f1 float(5,2),f2 decimal(5,2)
    );-- 写入
    insert into test_1 value(100, 100);
    select * from test_1;
    
    f1f2
    100100.00
  • 单精度:使用 4 个字节存储,有效数字为 8 位,MySQL 中的 float 类型为单精度。

  • 双精度:使用 8 个字节存储,有效数字为 16 位,MySQL 中的 double 类型为双精度。

    -- 建表,精度和标度,都是用 MySQL 中的极限值
    create table test_13(
    f1 float(255, 30) UNSIGNED,
    f2 DOUBLE(255, 30) UNSIGNED
    );-- 写入圆周率
    insert into test_13 value(3.14159265358979323846, 3.14159265358979323846);select * from test_5;
    
    f1f2
    3.14159273.141592653589793

1. 浮点类型

MySQL 中的浮点类型有 float 和 double,其中 float 为单精度 double 为双精度。

1.1 数值精度说明

MySQL 允许使用非标准语法(其他数据库未必支持,因此如果涉及到数据迁移,则最好不要这么用)FLOAT(M,D) 或 DOUBLE(M,D)。这里,M 称为精度,D 称为标度。(M,D) 中 M = 整数位 + 小数位,D = 小数位。 D <= M <= 255,0 <= D <= 30。

例如,定义为 FLOAT(5,2) 的一个列可以显示为 -999.99 - 999.99 如果超过这个范围会报错。

浮点类型,也可以加 UNSIGNED,但是不会改变数据范围,例如:FLOAT(3,2) UNSIGNED 仍然只能表示 0 - 9.99 的范围。

PS:整数类型 UNSIGNED 和 SIGNED 的范围会有变化,例如 int 类型,UNSIGNED 的最大值是 4294967295 有 SIGNED 的最大值是 2147483647。

所以在 MySQL 8.0 版本,已经计划取消指定位数,及 UNSIGNED 小数类型,创建表时会有 warning:

Specifying number of digits for floating point data types is deprecated and will be removed in a future release.
UNSIGNED for decimal and floating point data types is deprecated and support for it will be removed in a future release.

1.2 整数超出范围

如果存储时,整数部分超出了范围,MySQL就会报错,不允许存这样的值。

-- 创建测试表,范围是 -999.9 - 999.9
CREATE TABLE test1
(f1 FLOAT(4, 1),f2 double(4, 1)
);-- 插入整数范围内的数字,可以正常插入
insert into test1 value (123.4, 123.4);-- 插入范围外的数字,异常
insert into test1 value (1234.5, 1234.5);
--  [22003][1264] Out of range value for column 'f1' at row 1

1.3 小数超出范围

如果小数超出范围,会四舍五入,如果四舍五入计算后,导致整数超出范围,会报错。

-- 创建测试表,范围是 -999.9 - 999.9
CREATE TABLE test1
(f1 FLOAT(4, 1),f2 double(4, 1)
);-- 插入整数范围内的数字,可以正常插入,小数超过范围
insert into test1 value (123.45, 123.45);-- 小数超过范围,四舍五入后,整数也会超过范围,返回异常
insert into test1 value (999.95, 999.95);
--  [22003][1264] Out of range value for column 'f1' at row 1
f1f2
123.4123.4
123.5123.5

1.4 精度误差说明

-- 创建一张表,DOUBLE 类型
CREATE TABLE test_double2
(f1 DOUBLE
);-- 插入数据
INSERT INTO test_double2
VALUES (0.47),(0.44),(0.19);-- 计算
select sum(f1) from test_double2;
sum(f1)
1.0999999999999999

在计算时,可能会丢失精度,所以与钱相关的字段,建议使用 DECIMAL 类型。一般为 DECIMAL(16, 4) 精确到 角、分、厘、毫。

2. 定点类型

MySQL 中定点类型一般指的是 DECIMAL,列的声明语法是DECIMAL(M,D)。NUMERIC 与 DECIMAL 同义,如果字段类型定义为 NUMERIC,则将自动转成 DECIMAL。

2.1 数值精度说明

对于声明语法 DECIMAL(M,D),自变量的值范围如下:

  • M 是最大位数(精度),范围是 1 到 65。可不指定,默认值是 10。
  • D 是小数点右边的位数(小数位)。范围是 0 到 30,并且不能大于 M,可不指定,默认值是 0。

例如字段 salary DECIMAL(5,2),能够存储具有五位数字和两位小数的任何值,因此可以存储在 salary 列中的值的范围是从 -999.99 到 999.99

2.2 整数超出范围

如果存储时,整数部分超出了范围,MySQL就会报错,不允许存这样的值。

-- 创建测试表,范围是 -999.9 - 999.9
create table t2(f1 decimal(3, 2)
);-- 插入整数范围内的数字,可以正常插入
insert into test1 value (3.14, 3.14);-- 插入范围外的数字,异常
insert into test1 value (1234.5, 1234.5);
--  Out of range value for column 'f1' at row 1

2.3 小数超出范围

如果小数超出范围,会四舍五入,如果四舍五入计算后,导致整数超出范围,会报错。

-- 创建测试表,范围是 -999.9 - 999.9
create table t2(f1 decimal(3, 2)
);-- 小数超过范围,会四舍五入自动截断
insert into t2 value(9.991);-- 插入范围外的数字,异常
insert into t2 value(9.998);
--  Out of range value for column 'f1' at row 1
f1
9.99

总结

在 MySQL 中虽然 float、double、decimal 类型都可以存储小数,但是浮点类型 float、double 无法保证计算精度,和钱相关的字段建议使用 DECIMAL(16, 4) 精确到 角、分、厘、毫。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/88700.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity打包Windows程序,概率性出现无法全屏或分辨率不匹配

排除代码和Resolution and Presentation面板设置问题 如果程序还是不能按照预期的分辨率运行&#xff0c;应该是系统注册表记录了对应的设置。 解决方案&#xff1a; 打开注册表&#xff0c;使用快捷键“Win” "R"组合快捷键。在打开后面键入命令&#xff1a;Rege…

App Inventor 2 开发 ChatGPT 对话App

ChatGPT大家应该不会陌生&#xff0c;它的回答内容非常的专业及深入&#xff0c;具有实际的可指导性。我们通过App Inventor 2开发一个简单的对话App&#xff0c;先看效果&#xff1a; App Inventor 2 ChatGPT教育领域对话演示 代码块如下&#xff1a; 用到的核心组件“ChatBot…

nlp大模型课程笔记

自然语言处理基础和应用 &#x1f446;说明之前的大模型其实有很多都是基于迁移学习的方法。 attention机制的总结&#xff0c;解决了信息瓶颈的问题。 处理词组时BPE的过程 &#x1f446;pos表示的是token所在的位置 &#x1f446;技巧是layer normalization。

MySQL有哪些常见的存储引擎?

主要存储引擎 主要的三个存储引擎MyISAMMemoryInnoDB 那存储引擎应该怎么选择&#xff1f;InnoDB 和 MylSAM 主要有什么区别&#xff1f; MySQL有9种存储引擎&#xff0c;不同的引擎&#xff0c;适合不同的场景&#xff0c;我们最常用的&#xff0c;可能就是InnoDB&#xff0c;…

A卡崩溃有救了 AMD推出RGD专用工具:找出报错原因

现在的三大显卡GPU厂商中&#xff0c;谁家的显卡好争议不断&#xff0c;粉丝不仅争硬件性能&#xff0c;软件驱动也是容易被诟病的地方&#xff0c;AMD显卡这方面就吃过亏&#xff0c;好在AMD这次推出了一个RGD工具&#xff0c;可以找出显卡崩溃的原因。 AMD日前发布了一个Rade…

自然语言处理2-NLP

目录 自然语言处理2-NLP 如何把词转换为向量 如何让向量具有语义信息 在CBOW中 在Skip-gram中 skip-gram比CBOW效果更好 CBOW和Skip-gram的算法实现 Skip-gram的理想实现 Skip-gram的实际实现 自然语言处理2-NLP 在自然语言处理任务中&#xff0c;词向量&#xff08;…

vs2008下的mfc hello world实现

笔者不知道会写这种博文&#xff0c;好久没写mfc程序&#xff0c;hello world都不会创建了。起因是来了个mfc任务&#xff0c;那就得把mfc熟悉起来&#xff0c;先看下实现效果吧 因为是基于2008的&#xff0c;那就按照2008创建吧 文章目录 第一步&#xff1a;文件新建项目第二…

Tomcat 部署时 war 和 war exploded区别

在 Tomcat 调试部署的时候&#xff0c;我们通常会看到有下面 2 个选项。 是选择war还是war exploded 这里首先看一下他们两个的区别&#xff1a; war 模式&#xff1a;将WEB工程以包的形式上传到服务器 &#xff1b;war exploded 模式&#xff1a;将WEB工程以当前文件夹的位置…

Linux环境离线安装MySQL8.0.33

目录 一、准备 1、检查libaio.so.1 2、卸载删除原有的mariadb 3、删除my.cnf 4、下载mysql安装包 二、安装 1、上传mysql 2、建立mysql所需目录 3、建立配置文件my.cnf 4、创建mysql用户并授权 5、初始化数据库 6、启动MySQL数据库 7、常见启动报错处理 8、配置M…

SQLSTATE[IMSSP]: The active result for the query contains no fields.

我的是SQL server 报错场景&#xff0c;代码&#xff1a; $psendmx_sql"SET IDENTITY_INSERT PSENDMX ON;INSERT INTO psendmx (DJBH,MIBH,MXBH,SPDM,GG1DM,GG2DM,SL,SL_2,CKJ,ZK,DJ,DJ_1,JE,HH) VALUES {$mx_values};SET IDENTITY_INSERT PSENDMX OFF;"; $a$db_er…

前端面试必备 | uni-app 篇(P1-15)

文章目录 1. 请简述一下uni-app的定义和特点。2. uni-app兼容哪些前端框架&#xff1f;请列举几个。3. 请简述一下uni-app的跨平台工作原理。4. 什么是条件编译&#xff1f;在uni-app中如何实现条件编译&#xff1f;5. uni-app中的页面生命周期有哪些&#xff1f;请简要介绍。6…

【爬虫GUI】YouTube评论采集软件,突破反爬,可无限爬取!

文章目录 一、背景介绍1.1 软件说明1.2 效果演示 二、科普知识2.1 关于视频id2.2 关于评论时间 三、爬虫代码3.1 界面模块3.2 爬虫模块3.3 日志模块 四、获取源码及软件 一、背景介绍 你好&#xff0c;我是马哥python说 &#xff0c;一名10年程序猿。 最近我用python开发了一…