mysql中的生日應該是什么類型_MySQL中的定點數類型

上一篇文章我們嘮叨了浮點數,知道了浮點數存儲小數是不精確的。本篇繼續嘮叨一下MySQL中的另一種存儲小數的方式 —— 定點數。浮點數文章閃現:

  • 什么, 0.3 - 0.2 ≠ 0.1 ? 什么鬼

定點數類型

正因為用浮點數表示小數可能會有不精確的情況,在一些情況下我們必須保證小數是精確的,所以設計MySQL的大叔們提出一種稱之為定點數的數據類型,它也是存儲小數的一種方式:

7336ac96992bdc04bb5cba36f08e871f.png

其中:

  • M表示該小數最多需要的十進制有效數字個數。

    注意是有效數字個數,比方說對于小數-2.3來說有效數字個數就是2,對于小數0.9來說有效數字個數就是1

  • D表示該小數的小數點后的十進制數字個數。

    這個好理解,小數點后有幾個十進制數字,D的值就是什么。

舉個例子看一下,設置了MD的單精度浮點數的取值范圍的變化:

類型取值范圍
DECIMAL(4, 1)-999.9~999.9
DECIMAL(5, 1)-9999.9~9999.9
DECIMAL(6, 1)-99999.9~99999.9
DECIMAL(4, 0)-9999~9999
DECIMAL(4, 1)-999.9~999.9
DECIMAL(4, 2)-99.99~99.99

可以看到,在D相同的情況下,M越大,該類型的取值范圍越大;在M相同的情況下,D越大,該類型的取值范圍越小。當然,MD的取值也不是無限大的,M的取值范圍是1~255D的取值范圍是0~30,而且D的值必須不大于MMD都是可選的,如果我們省略了它們,那它們的值按照機器支持的最大值來存儲。

我們說定點數是一種精確的小數,為了達到精確的目的我們就不能把它轉換成二進制小數之后再存儲(因為有很多十進制小數轉為二進制小數后需要進行舍入操作,導致二進制小數表示的數值是不精確的)。其實轉念一想,所謂的小數只是把兩個十進制整數用小數點分割開來而已,我們只要把小數點左右的兩個十進制整數給存儲起來,那不就是精確的了么。比方說對于十進制小數2.38來說,我們可以把這個小數的小數點左右的兩個整數,也就是238分別保存起來,那么不就相當于保存了一個精確的小數么,這波操作是不是很6。

當然事情并沒有這么簡單,對于給定MD值的DECIMAL(M, D)類型,比如DEMCIMAL(16, 4)來說:

  • 首先確定小數點左邊的整數最多需要存儲的十進制位數是12位,小數點右邊的整數需要存儲的十進制位數是4位,如圖所示:

    38f5cd44dc7c6f3b5019fd1936f4f0a8.png
  • 從小數點位置出發,每個整數每隔9個十進制位劃分為1組,效果就是這樣:

    29e92c074a7be7d1e8d41adeab44ba87.png

    從圖中可以看出,如果不足9個十進制位,也會被劃分成一組。

  • 針對每個組中的十進制數字,將其轉換為二進制數字進行存儲,根據組中包含的十進制數字位數不同,所需的存儲空間大小也不同,具體見下表:

    組中包含的十進制位數占用存儲空間大小(單位:字節)
    1或21
    3或42
    5或63
    7或8或94

    所以DECIMAL(16, 4)共需要占用8個字節的存儲空間大小,這8個字節由下邊3個部分組成:

    • 第1組包含3個十進制位,需要使用2個字節存儲。

    • 第2組包含9個十進制位,需要使用4個字節存儲。

    • 第3組包含4個十進制位,需要使用2個字節存儲。

  • 將轉換完成的比特位序列的最高位設置為1。

這些步驟看的有一丟丟懵逼吧,別著急,舉個例子就都清楚了。比方說我們使用定點數類型DECIMAL(16, 4)來存儲十進制小數1234567890.1234,這個小數會被劃分成3個部分:

1 234567890 1234

也就是:

  • 第1組中包含整數1

  • 第2組中包含整數234567890

  • 第3組中包含整數1234

然后將每一組中的十進制數字轉換成對應的二進制數字:

  • 第1組占用2個字節,整數1對應的二進制數就是(字節之間實際上沒有空格,只不過為了大家理解上的方便我們加了一個空格):

    00000000 00000001

    二進制看起來太難受,我們還是轉換成對應的十六進制看一下:

    0x0001
  • 第2組占用4個字節,整數234567890對應的十六進制數就是:

    0x0DFB38D2
  • 第3組占用2個字節,整數1234對應的十六進制數就是:

    0x04D2

所以將這些十六進制數字連起來之后就是:

0x00010DFB38D204D2

最后還要將這個結果的最高位設置為1,所以最終十進制小數1234567890.1234使用定點數類型DECIMAL(16, 4)存儲時共占用8個字節,具體內容為:

0x80010DFB38D204D2

有的同學會問,如果我們想使用定點數類型DECIMAL(16, 4)存儲一個負數怎么辦,比方說-1234567890.1234,這時只需要將0x80010DFB38D204D2中的每一個比特位都執行一個取反操作就好,也就是得到下邊這個結果:

0x7FFEF204C72DFB2D

從上邊的敘述中我們可以知道,對于DECIMAL(M, D)類型來說,給定的MD的值不同,所需的存儲空間大小也不同。可以看到,與浮點數相比,定點數需要更多的空間來存儲數據,所以如果不是在某些需要存儲精確小數的場景下,一般的小數用浮點數表示就足夠了。

對于定點數類型DECIMAL(M, D)來說,MD都是可選的,默認的M的值是10,默認的D的值是0,也就是說下列等式是成立的:

DECIMAL = DECIMAL(10) = DECIMAL(10, 0)
DECIMAL(n) = DECIMAL(n, 0)

另外M的范圍是1~65D的范圍是0~30,且D的值不能超過M

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532069.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python怎么制作圖像_python數字圖像處理(5):圖像的繪制

實際上前面我們就已經用到了圖像的繪制,如:io.imshow(img)這一行代碼的實質是利用matplotlib包對圖片進行繪制,繪制成功后,返回一個matplotlib類型的數據。因此,我們也可以這樣寫:importmatplotlib.pyplot …

axios代理跨域 cli4_vuecli 3.0之跨域請求代理配置及axios路徑配置 莫小龍

vue-cli 3.0之跨域請求代理配置及axios路徑配置問題:在前后端分離的跨域請求中,報跨域問題配置:vue.config.js:module.exports {runtimeCompiler: true,publicPath: /, // 設置打包文件相對路徑devServer: {// open: process.pla…

string轉為char數組_StringBuilder的區別是什么?String是不可變?一點課堂(多岸學院)...

String和StringBuffer、StringBuilder的區別可變性簡單的來說:String 類中使用 final 關鍵字字符數組保存字符串,private final char value[],所以 String 對象是不可變的。而StringBuilder 與 StringBuffer 都繼承自 AbstractStringBuild…

python去年軟件排行_2017年編程語言排行榜,Python位居榜首(C語言需求最大)

最近IEEE Spectrum 發布了編程語言交互式排行榜,為很多學習代碼的朋友們詳解各類代碼語言的需求和占有率。為學習代碼的朋友們能更加重視哪一種編程語言而有一個明確的方向。下面排行榜123網為你公布2017年編程語言排行榜,Python位居榜首(C語言需求最大)。2017年編程…

mysql test數據庫_mysql數據庫test

Re介紹一下CentOS下MySQL數據庫的安裝與配置方法MySQL數據庫配置的具體步驟:1、編輯MySQL的配置文件,使用vi /etc/my.cnf[rootsample ~]# vi /etc/my.cnf  ← 編輯MySQL的配置文件[mysqld]datadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sock# Defau…

mysql 升級 openssl_【1分鐘教程】LNMP架構應用實戰 Openssl升級操作

由于實際生產環境需求,需要將LNMP環境中的openssl版本升級至目前最新版本openssl-1.1.0c,這玩意升級還真的不是一般的麻煩,由于它與系統各種服務都有相關的聯系,比如ssh服務等,因此,升級非常的繁瑣,所以今天…

miui秒解bl鎖_MIUI12解鎖bl篇(原諒我的過失,接上篇文章)

求原諒真心求原諒由于我的疏忽,上期教程不完整,對大家造成不便在這里給大家真誠道歉!對不起!請收下我的膝蓋!!!我的上個教程小米手機MIUI系統降級任意版本通用教程,MIUI12→MIUI9因為…

腐蝕rust服務器命令_【使用 Rust 寫 Parser】2. 解析Redis協議

系列所有文章https://zhuanlan.zhihu.com/p/115017849?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/139387293?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/146455601?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/186217695?zhuanlan.zhihu.com在基本熟悉 n…

python中dic_python之dic {字典}(重要指數*****)

1. 什么是字典{name: 汪峰, age: 18} 鍵:值 別的語言鍵值對數據鍵: 必須是可哈希(不可變的數據類型),并且是唯一的值: 任意可以保存任意類型的數據字典是無序的python3.6版本以上,默認定義了順序,python3.5以下是隨機顯示不能進?切片?作. 它只能通過key來獲取dict中的數據字典…

python裝飾器帶參數函數二階導數公式_一文搞定Python裝飾器,看完面試不再慌

本文始發于個人公眾號:TechFlow,原創不易,求個關注今天是Python專題的第12篇文章,我們來看看Python裝飾器。一段囧事差不多五年前面試的時候,我就領教過它的重要性。那時候我Python剛剛初學乍練,看完了廖雪…

centos7源碼安裝mysql報錯_CentOS7 下源碼安裝MySQL數據庫 8.0.11

本文主要向大家介紹了CentOS7 下源碼安裝MySQL數據庫 8.0.11,通過具體的內容向大家展現,希望對大家學習MySQL數據庫有所幫助。CentOS7 下源碼安裝MySQL 8.0.11系統環境:CentOS7, 內核:Linux 3.10.0-862.el7.x86_64如果…

python全排列問題_Python基于回溯法子集樹模板解決全排列問題示例

本文實例講述了Python基于回溯法子集樹模板解決全排列問題。分享給大家供大家參考,具體如下:問題實現 a, b, c, d 四個元素的全排列。分析這個問題可以直接套用排列樹模板。不過本文使用子集樹模板。分析如下:一個解x就是n個元素的一種排列&a…

file js new 傳到后臺_js 圖片上傳傳給后臺的3種格式

$("#imgfile").change(function () {var formData new FormData();$.each($(#imgfile)[0].files, function (i, file) {formData.set(idcard, file); //idcard 字段 根據自己后端接口定});//processData: false, contentType: false,多用來處理異步上傳二進制文件。…

usbserialcontroller驅動安裝不了_win10-有NVIDIA獨顯提示未安裝控制面板的離線安裝方式...

最近越來越多的用戶反映NVIDIA顯卡驅動設置不了啦,找不到NVIDIA顯卡的控制面板。 也不知道NVIDIA在什么版本開始驅動安裝包就不自帶NVIDIA顯卡控制面板了。 全新安裝的顯卡驅動就沒有控制面板;或者Windows 10自帶更新了顯卡新版驅動后導致沒有。 每次帶N…

mysql 多實例 獨立配置文件_三、安裝配置多實例MYSQL5.6-多獨立配置文件方法

三、安裝配置多實例MYSQL5.6-多獨立配置文件方法1、準備工作檢查操作系統版本、內核版本、selinux是否關閉、防火墻策略、IP地址、主機名配置、host表配置、yum配置上傳cmake、mysql5.6軟件包具體步驟參考源碼安裝mysql-單實例配置文檔2、安裝cmake軟件2.1 安裝編譯軟件環境[[e…

python做什么模型_主題模型初學者指南[Python]

引言近年來涌現出越來越多的非結構化數據,我們很難直接利用傳統的分析方法從這些數據中獲得信息。但是新技術的出現使得我們可以從這些輕易地解析非結構化數據,并提取出重要信息。主題模型是處理非結構化數據的一種常用方法,從名字中就可以看…

python實現隊列_Python學習教程:用隊列實現棧

接著上一期跟大家說的用棧實現隊列,這期的Python學習教程跟大家講用隊列實現棧題目:使用隊列實現棧的下列操作:push(x) – 元素 x 入棧pop() – 移除棧頂元素top() – 獲取棧頂元素empty() – 返回棧是否為空Implement the following operati…

vue 點擊li 中的img 怎么不冒泡_Vue全解

一.Vue實例內存圖:1.把Vue的實例命名為vm,vm對象封裝了對視圖的所有操作包括數據讀寫、事件綁定、DOM更新2.vm的構造函數是Vue,按照ES6的說法vm所屬的類是Vue3.options是new Vue的參數一般稱為選項或構造選項1.options里面有什么英文文檔搜op…

python布局管理_Python基礎=== Tkinter Grid布局管理器詳解

本文轉自:https://www.cnblogs.com/ruo-li-suo-yi/p/7425307.html 箬笠蓑衣Grid(網格)布局管理器會將控件放置到一個二維的表格里。主控件被分割成一系列的行和列,表格中的每個單元(cell)都可以放置一個控件。注意:不要試圖在一個主…

python面向對象類_python面向對象-類和對象

一. 類的定義class類名():代碼#定義類classWasher():defwash(self):print("洗衣服")注意:類名要滿足標識符命名規則,同時遵循大駝峰命名習慣。二. 創建對象對象名 類名()#創建對象w Washer()#調用方法w.wash() #洗衣服三. selfself指的是調用…