【重学 MySQL】五十五、浮点和定点数据类型

news2024/10/4 5:05:56

【重学 MySQL】五十五、浮点和定点数据类型

  • 种类
  • 选择
  • 数据精度说明
    • 浮点数据精度
    • 定点数据精度
    • 总结
  • 精度误差说明
    • 浮点数据精度误差
    • 定点数据精度误差
    • 总结
  • 示例
  • 注意事项
  • 开发中经验

在这里插入图片描述

在MySQL中,浮点和定点数据类型用于存储小数和实数。

种类

MySQL提供了两种主要的浮点数据类型:FLOAT和DOUBLE,以及一种定点数据类型DECIMAL。

  1. FLOAT:单精度浮点数,占用4个字节的存储空间。它可以表示的数值范围大约是-3.402823466E+38到-1.175494351E-38,以及0和1.175494351E-38到3.402823466E+38。FLOAT类型通常用于存储精度要求不是特别高的小数,如商品价格等。
  2. DOUBLE:双精度浮点数,占用8个字节的存储空间。它可以表示的数值范围大约是-1.7976931348623157E+308到-2.2250738585072014E-308,以及0和2.2250738585072014E-308到1.7976931348623157E+308。DOUBLE类型具有更高的精度和更大的范围,适用于科学计算等需要高精度的数值场景。
  3. DECIMAL:定点数类型,用于存储具有固定精度和小数位数的数值。DECIMAL类型的精度由用户定义,可以指定总的数字位数(M)和小数点后的数字位数(D)。DECIMAL类型在存储时不会发生任何近似或舍入错误,因此适用于财务和精确计算等场景。

选择

在选择浮点数据类型时,需要考虑以下因素:

  1. 精度要求:根据数据的精度要求选择合适的浮点和定点数据类型。如果精度要求不是特别高,可以选择FLOAT类型;如果精度要求较高,可以选择DOUBLE类型;如果需要固定精度和小数位数,可以选择DECIMAL类型。
  2. 存储范围:根据数据的存储范围选择合适的浮点和定点数据类型。如果数据范围较小,可以选择FLOAT类型;如果数据范围较大,可以选择DOUBLE类型。
  3. 性能:在处理大量数据时,较小的浮点和定点数据类型(如FLOAT)通常具有更好的性能。然而,如果精度和范围是关键因素,可能需要选择较大的浮点和定点数据类型(如DOUBLE)或定点数据类型(如DECIMAL)。
  4. 应用场景:根据应用场景选择合适的浮点和定点数据类型。例如,在存储商品价格时,可以选择FLOAT类型;在进行科学计算时,可以选择DOUBLE类型;在处理财务和精确计算时,可以选择DECIMAL类型。

数据精度说明

浮点数据精度

浮点数据(如FLOAT、DOUBLE等)在计算机中采用科学记数法的方式存储,包括一个尾数(有效数字)和一个指数(表示小数点的位置)。浮点数的精度主要由尾数的位数决定。

  1. 单精度浮点数(float)

    • 尾数通常为23位(IEEE 754标准),但由于有一个隐含的1位(即小数点左侧只能有1位,且必须为1),因此实际有效位数为24位。
    • 在十进制中,这大约相当于7~8位有效数字。
  2. 双精度浮点数(double)

    • 尾数通常为52位(IEEE 754标准),同样有一个隐含的1位,因此实际有效位数为53位。
    • 在十进制中,这大约相当于15~16位有效数字。

浮点数的精度是有限的,因为计算机无法精确表示所有的小数。特别是那些无法被二进制完整表示的小数,计算机只能尽量用接近的值来表示,这就会导致精度误差。例如,0.1在二进制中无法被精确表示,因此使用二进制的计算机在存储和计算0.1时会存在精度问题。

定点数据精度

定点数据(如DECIMAL等)在计算机中采用固定小数点位置的方式存储,即小数点位置是固定的,不会随着数值的变化而变化。定点数的精度由其小数位数确定。

  1. 定点整数:小数点位置在数的最右侧,即没有小数部分。
  2. 定点小数:小数点位置在数的中间或左侧,具有固定的小数位数。

定点数的精度取决于用户定义的小数位数。例如,如果一个定点数被定义为具有4位小数,那么它就可以精确表示到小数点后第四位。由于定点数采用固定小数点位置的方式存储,因此它们可以精确表示指定精度范围内的小数数值,不会发生精度丢失。

总结

  • 浮点数:精度由尾数的位数决定,单精度浮点数大约具有78位有效数字,双精度浮点数大约具有1516位有效数字。由于计算机无法精确表示所有的小数,因此浮点数在存储和计算时可能会存在精度误差。
  • 定点数:精度由用户定义的小数位数确定。由于采用固定小数点位置的方式存储,因此定点数可以精确表示指定精度范围内的小数数值,不会发生精度丢失。

在选择数据类型时,应根据具体的应用场景和需求来选择合适的类型。如果需要高精度计算,并且对存储空间没有特殊要求,那么定点数是一个更好的选择。如果需要对大范围数值进行计算,并且对精度要求不是特别高,那么浮点数可能是一个更合适的选择。

精度误差说明

浮点数据精度误差

浮点数据(如FLOAT、DOUBLE等)在计算机中采用科学记数法表示,其精度误差主要来源于以下几个方面:

  1. 表示误差

    • 浮点数采用二进制表示,而某些十进制小数在二进制下无法精确表示,只能近似存储。这种近似表示会导致存储的数值与实际数值之间存在微小的差异,即表示误差。
  2. 舍入误差

    • 在进行浮点数运算时,由于计算机内部表示的局限性,运算结果通常会被舍入到最接近的可表示数值。这种舍入操作会引入一定的误差,即舍入误差。
  3. 累积误差

    • 在多次浮点数运算过程中,每次运算引入的微小误差可能会逐渐累积,导致最终结果与实际值之间存在较大的差异,即累积误差。这种误差在连续运算或复杂计算中尤为明显。
  4. 溢出和下溢

    • 浮点数表示的范围是有限的,当数值超过其表示范围时,会发生溢出(导致结果无法表示)或下溢(导致结果接近零但非零)。这两种情况都会导致精度损失。

定点数据精度误差

定点数据(如DECIMAL等)在计算机中采用固定小数点位置的方式存储,其精度误差相对较小,主要来源于以下几个方面:

  1. 表示精度

    • 定点数可以精确表示指定精度范围内的小数数值,不会发生表示误差。其精度由用户定义的小数位数确定。
  2. 舍入规则

    • 在进行定点数运算时,如果需要舍入操作,通常会遵循特定的舍入规则(如四舍五入、向下舍入等)。这些规则在一定程度上可以减小舍入误差,但无法完全消除。
  3. 溢出

    • 定点数同样存在溢出问题,当数值超过其表示范围时,会导致结果无法表示。然而,由于定点数通常用于表示有限范围内的数值,因此溢出问题相对浮点数来说不那么常见。

总结

  • 浮点数:由于采用二进制表示和近似存储方式,浮点数在存储和计算时可能会引入表示误差、舍入误差和累积误差。这些误差在连续运算或复杂计算中尤为明显,可能导致最终结果与实际值之间存在较大差异。
  • 定点数:由于采用固定小数点位置的方式存储和精确表示指定精度范围内的数值,定点数的精度误差相对较小。然而,在进行舍入操作或超出表示范围时,仍可能引入一定的误差。

在选择数据类型时,应根据具体的应用场景和需求来选择合适的类型。如果需要高精度计算和对存储空间没有特殊要求,那么定点数是一个更好的选择。如果需要对大范围数值进行计算或对精度要求不是特别高,那么浮点数可能是一个更合适的选择。

示例

以下是一些使用浮点和定点数据类型的示例:

CREATE TABLE example (
    id INT NOT NULL AUTO_INCREMENT,
    price FLOAT(7,2) NOT NULL, -- 存储商品价格,最多7位数字,其中2位是小数
    scientific_value DOUBLE NOT NULL, -- 存储科学计算值,使用双精度浮点和定点数
    financial_value DECIMAL(10,2) NOT NULL, -- 存储财务数据,使用定点数类型,总共10位数字,其中2位是小数
    PRIMARY KEY (id)
);

在上面的示例中,price列使用了FLOAT类型来存储商品价格,scientific_value列使用了DOUBLE类型来存储科学计算值,而financial_value列则使用了DECIMAL类型来存储财务数据。

注意事项

  1. 精度损失:浮点和定点数据类型在存储和计算时可能会产生精度损失。因此,在需要高精度计算的场景中,应谨慎使用浮点和定点数据类型。
  2. 存储效率:浮点和定点数据类型占用的存储空间较大,可能会影响数据库的存储效率和性能。因此,在存储大量数据时,应合理选择浮点和定点数据类型以平衡精度和存储效率。
  3. 数据类型转换:在进行数据类型转换时,可能会导致精度损失或数据溢出。因此,在进行数据类型转换时,应确保目标数据类型能够容纳源数据类型的范围和精度。

综上所述,MySQL中的浮点和定点数据类型包括FLOAT、DOUBLE和DECIMAL三种类型。在选择浮点和定点数据类型时,需要考虑精度要求、存储范围、性能和应用场景等因素。合理使用浮点和定点数据类型可以提高数据库的存储效率和性能,同时满足数据的精度要求。

开发中经验

“由于 DECIMAL 数据类型的精准性,在我们的项目中,除了极少数(比如商品编号)用到整数类型外,其他的数值都用的是 DECIMAL,原因就是这个项目所处的零售行业,要求精准,一分钱也不能差。 ” ——来自某项目经理

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

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

相关文章

SuiteCRM系统 responseEntryPoint SQL注入复现(CVE-2024-36412)

0x01 产品描述: SuiteCRM是一款开源的CRM(客户关系管理)系统,它致力于为世界各地的用户提供高效、灵活和可定制的CRM解决方案。它为企业和组织提供了一套完整的客户关系管理解决方案,无论是中小型企业还是大型企业&…

Python和R及Julia妊娠相关疾病生物剖析算法

🎯要点 算法使用了矢量投影、现代优化线性代数、空间分区技术和大数据编程利用相应向量空间中标量积和欧几里得距离的紧密关系来计算使用妊娠相关疾病(先兆子痫)、健康妊娠和癌症测试算法模型使用相关性投影利用相关性和欧几里得距离之间的关…

linux第二课:常用命令

Kali Linux,黑客必备神器。跟着我,带你从入门到入狱! 第二课,常用命令。 1.whoami 翻译为中文:我是谁 用途:输出现在自己的用户身份(用户名) 参数:无参数 好吧,这透明度一调都不…

基于SpringBoot+Vue的汽车保险理赔系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

mysql UDF提权(实战案例)

作者:程序那点事儿 日期:2024/09/29 16:10 什么是UDF? 全称 User Define Function (用户自定义函数)UDF提权,就是通过自定义函数,实现执行系统的命令。 dll(windows,dll文件是c语…

10.1 10.3 图DFS 中等 207 Course Schedule 210 Course Schedule Ⅱ

207 Course Schedule class Solution { public:bool hasCycle(int course ,unordered_map<int,vector<int>>& graph,vector<int>& visitStatus){//正在访问的结点再次被访问&#xff0c;存在环if(visitStatus[course] 1)return true;//该结点已经被…

【CViT】Deepfake Video Detection Using Convolutional Vision Transformer

文章目录 Deepfake Video Detection Using Convolutional Vision Transformerkey points**卷积视觉变压器**FLViT实验总结Deepfake Video Detection Using Convolutional Vision Transformer 会议/期刊:2021 作者: key points 提出了一种用于检测深度伪造的卷积视觉变压器…

Linux学习之路 -- 线程 -- 死锁及线程安全相关问题

在上文中&#xff0c;我们已经介绍了线程池的编写&#xff0c;下面补充一下线程的相关知识。 目录 1、线程安全与可重入 <1>概念 <2>区别联系 <3>常见线程不安全的情况 <4>常见的不可重入情况 2、死锁问题 <1>死锁概念 <2>死锁四…

sql-labs靶场第二关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①Order by判断列数 ②判断回显地方 ③爆库&#xff0c;查看数据库名称 ④爆表&#xff0c;查看security库的所有表 ⑤爆列&#xff0c;查看users表的所有…

Redis-哨兵

概念 Redis Sentinel 相关名词解释 注意: 哨兵机制不负责存储数据,只是对其它的redis-server进程起到监控的作用哨兵节点,也会搞一个集合,防止一个挂了 ⼈⼯恢复主节点故障 用户监控: 实际开发中,对于服务器后端开发,监控程序,是很重要的 服务器长期运行,总会有一些意外,…

16.数据结构与算法-串,数组与广义表(串,BF算法,KMP算法)

串&#xff08;String&#xff09; 串的定义 关于串的术语 串的案例引入 串的类型定义 串的顺序存储结构 串的链式存储结构-块链结构 串的模式匹配算法&#xff08;BF算法与KMP算法&#xff09; BF算法 BF算法时间复杂度 KMP算法

CSS滚动条

通过《CSS盒子模型》一节的学习我们知道&#xff0c;页面中的每个元素都可以看作是一个矩形的盒子&#xff0c;我们可以使用 CSS 来控制盒子的大小、位置等等信息。默认情况下&#xff0c;当元素中的内容超出盒子的大小时&#xff0c;例如元素内容区的宽度和高度所组成的矩形区…

Django连接Dify、ChatGPT4o并计算tokens数量方法

通过Dify可以连接很多模型国内、国外的都可以进行选择可以到Dify里创建一个空白应用&#xff0c;然后点击进入就可以看到API了api_url "http://192.168.15.131/v1/chat-messages" api_key "app-UtzTpVNwpTLUcGvRNnnK9QNY" headers {"Authorization…

网站开发基础:JavaScript

前端开发主要使用的技术如 HTML、CSS 和 JavaScript 等。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>.myDivClass{border: solid red 1px;width: 50px;height:…

python如何查询函数

1、通用的帮助函数help() 使用help()函数来查看函数的帮助信息。 如&#xff1a; import requests help(requests) 会有类似如下输出&#xff1a; 2、查询函数信息 ★查看模块下的所有函数&#xff1a; dir(module_name) #module_name是要查询的函数名 如&#xff1a; i…

【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

PCL 点云统计滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 统计滤波实现 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xf…

Android SystemUI组件(10)禁用/重启锁屏流程分析

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 应用入口处理流程解读 即可。 在 Android 系统中&#xff0c;禁用锁屏…

C++初学者指南-5.标准库(第二部分)–随机数生成

C初学者指南-5.标准库(第二部分)–随机数生成 文章目录 C初学者指南-5.标准库(第二部分)–随机数生成基本概念例子统一随机数布尔值&#xff08;“抛硬币”&#xff09;正态分布具有独立概率的整数 怎么做种子引擎使用自定义生成器 shuffle算法分布类型概述通用接口均匀分布采样…

虚拟机 VMware 安装 macOS

macOS 界面 MAC OS IOS下载&#xff1a; amacOS Monterey by Techrechard.comwmacOS Monterey by Techrechard.com 下载&#xff1a;Unlocker-v2.0.1-x64 Mac OS X 虚拟机中更改屏幕分辨率 终端输入命令&#xff1a; sudo defaults write /Library/Preferences/com.apple.w…