MySQL 小数类型介绍

news2025/1/20 5:55:11

文章目录

    • 前言
      • 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.coloradmin.cn/o/925648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 之利用 localEulerAngle与EulerAngle 控制物体旋转

文章目录 概念讲解localEulerAngle与EulerAngle的区别 概念讲解 欧拉角&#xff08;Euler Angles&#xff09;是一种常用于描述物体在三维空间中旋转的方法。它使用三个角度来表示旋转&#xff0c;分别绕物体的三个坐标轴&#xff08;通常是X、Y和Z轴&#xff09;进行旋转。这…

cvat 安装部署

官网地址&#xff1a; https://github.com/opencv/cvat/tree/masterhttps://github.com/opencv/cvat/tree/master 1.从官网上下载源码地址。 2.配置环境变量 vim /etc/profile 或者执行&#xff1a; export CVAT_HOSTyour-ip-address 3.执行命令 docker-compose up -d …

视频中的声音怎么提取出来?这样做提取出来很简单

提取视频中的声音可以有多种用途。例如&#xff0c;我们可能希望从视频中提取音乐或音效&#xff0c;以在其他项目中使用。或者&#xff0c;可能需要将视频中的对话转录为文本&#xff0c;以便更轻松地编辑和共享内容。无论目的是什么&#xff0c;提取视频中的声音都可以帮助我…

Dwg如何转dxf格式?分享三种转换小技巧

DWG格式是CAD的原生格式&#xff0c;但是DXF文件格式是CAD支持的通用格式。将DWG文件转换为DXF文件可以使其他软件能够读取和编辑这些文件&#xff0c;因为大多数CAD软件都支持DXF格式。此外&#xff0c;DXF文件比DWG文件更小&#xff0c;在传输和存储时更方便。因此&#xff0…

“摧毁我们的文明”?推特博主马斯克批评TikTok:我决定不再使用

根据8月25日的消息&#xff0c;推特博主DogeDesigner发表了关于TikTok的批评言论&#xff0c;声称这个应用正在“摧毁我们的文明”。 他在配图中展示了两种形象&#xff0c;左边的形象代表着各方面的专家知识&#xff0c;如天文学、数学、物理学、哲学和生活等&#xff0c;但似…

从LeakCanary看内存快照生成

前面我们已经完成了生命周期监控并且可以通过ReferenceQueue和WeakHashMap的比较确定哪些对象发生泄漏了&#xff0c;那么接下来需要考虑的就是如何确定这个对象是被谁持有导致泄漏的呢&#xff1f; 从内存泄漏一文中可知&#xff0c;当我们使用Android Studio或MAT分析内存泄…

vue3范围选择组件封装

个人项目地址&#xff1a; SubTopH前端开发个人站 &#xff08;自己开发的前端功能和UI组件&#xff0c;一些有趣的小功能&#xff0c;感兴趣的伙伴可以访问&#xff0c;欢迎提出更好的想法&#xff0c;私信沟通&#xff0c;网站属于静态页面&#xff09; SubTopH前端开发个人站…

测试框架pytest教程(10)自定义命令行-pytest_addoption

pytest_addoption pytest_addoption是pytest插件系统中的一个钩子函数&#xff0c;用于向pytest添加自定义命令行选项。 在pytest中&#xff0c;可以使用命令行选项来控制测试的行为和配置。pytest_addoption钩子函数允许您在运行pytest时添加自定义的命令行选项&#xff0c;…

四信智能充电桩解决方案

新能源汽车是信息技术与制造体系的全面融合&#xff0c;是产业发展的大势所趋&#xff0c;也是新动能的重要支点&#xff0c;而推进充电基础设施建设则是实现我国从汽车大国迈向汽车强国必由之路战略举措的有力保障。 据国际能源署测算&#xff0c;2030年全球私人充电桩保有量预…

数组和指针的练习解析(4)

题目&#xff1a; int main() { int aa[2][5] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int *ptr1 (int *)(&aa 1); int *ptr2 (int *)(*(aa 1)); printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1)); return 0; } 思路分析&#xff1a; int *ptr1 (int *)(&…

Java的锁大全

Java的锁 各种锁的类型 乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念&#xff0c;体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。 先说概念。对于同一个数据的并发操作&#xff0c;悲观锁认为自己在使用数据的时候一定有别的线程来修改数…

AMBA总线协议(0)——目录与传送门

一、AMBA总线协议 Arm高级微控制器总线架构&#xff08;Advanced Microcontroller Bus Architecture&#xff0c;AMBA&#xff09;是一种开放式标准片上互联规范&#xff0c;用于连接和管理片上系统&#xff08;System on Chip,Soc&#xff09;中的功能块。 AMBA是一种广泛用于…

跨域知识点+springboot解决跨域

目录 一 跨域简介 二 跨域的三种情况 三 springboot解决跨域案例 一 跨域简介 什么是跨域&#xff1f; 由于浏览器的一些安全性限制&#xff0c;不允许前端页面访问一些协议不同、域名不同、端口号不同的http接口&#xff0c;例如我本地创建一个html&#xff0c;里面写一个a…

什么是代码审计?怎么做?

代码审计是对源代码进行人工或自动化审查&#xff0c;以查找潜在的安全漏洞和隐患。在信息安全测试中&#xff0c;代码审计是非常重要的一环。它主要包括以下几个方面&#xff1a; 1.变量验证&#xff1a;检查代码是否对变量进行验证&#xff0c;防止变量被恶意用户篡改。 2.…

python systemrdl 使用实例

今天来看一个具体实例&#xff0c;上一篇传送门&#xff1a;python SystemRDL 包介绍_Bug_Killer_Master的博客-CSDN博客 通常来说&#xff0c;我们验证过程用到的情况大多都是需要提取reg field的路径以及reset 值等信息&#xff0c;所以比较常见的一种方法就是先把rdl compil…

深入理解python虚拟机:调试器实现原理与源码分析

调试器是一个编程语言非常重要的部分&#xff0c;调试器是一种用于诊断和修复代码错误&#xff08;或称为 bug&#xff09;的工具&#xff0c;它允许开发者在程序执行时逐步查看和分析代码的状态和行为&#xff0c;它可以帮助开发者诊断和修复代码错误&#xff0c;理解程序的行…

vue(element ui安装)

目录 一&#xff0c;element ui安装二&#xff0c;main.js三&#xff0c;使用element ui最后 一&#xff0c;element ui安装 先在盘服中找到你创建的node的位置 如有不懂根据可以看看上一章安装node 然后在终端找到 进入这个位置之后就可以安装了 输入npm i element-ui -S这个…

什么是长短时记忆网络(LSTM)

什么是长短时记忆网络(LSTM) RNN有一定的记忆能力&#xff0c;但不幸的是它只能保留短期记忆&#xff0c;在各类任务上表现并不好&#xff0c;那该怎么办? 人们将目光投向了自己&#xff0c;人类的记忆是有取舍的&#xff0c;我们不会记住每时每刻发生的所有事&#xff0c;会…

基于Java+SpringBoot+vue前后端分离高校办公室行政事务管理系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

奎文区残疾人联合会党组领导侯效刚、刘金玲莅临考察交流

2023年8月15日上午&#xff0c;为进一步提升残疾人精准化服务水平&#xff0c;推动“如康家园”残疾人之家建设有序展开&#xff0c;奎文区残疾人联合会党组书记兼理事长侯效刚&#xff0c;党组成员兼副理事长刘金玲&#xff0c;潍州路街道办事处副主任董江芹主任一行5人莅临潍…