mysql神功 2.2 數(shù)據(jù)類型的細(xì)分之浮點(diǎn)數(shù)類型與定點(diǎn)數(shù)類型
講解之前,先回答大家一個問題,好多小伙伴買了各種MySQL書籍,講到這里時,書中都會聲明Float和Double類型的取值范圍,還是用科學(xué)計(jì)數(shù)法寫的,其實(shí)這個范圍與你無關(guān)。

如圖2-18,我們在玩「和平精英」時,我們從A地到B地,有一個必經(jīng)的路口,直行距離最近,但是可能會遇到敵人,無論左轉(zhuǎn)還是右轉(zhuǎn)都有毒圈,你去計(jì)算毒圈會損你多少血是沒有意義的,除非走投無路了,否則我們應(yīng)該不進(jìn)入毒圈。
一、什么是精度

小學(xué)數(shù)學(xué)知識:數(shù)級與數(shù)位:圖2-19
數(shù)級:個級、萬級、億級......
數(shù)位:個位、十位、百位、千位、萬位、十萬位、百萬位、千萬位、億位......
我們生活中,最常用的精度就是抹零,記得小時候去商店買東西,差一分錢都不行,現(xiàn)在買東西,不足1角錢都不收了直接抹零。你去4S店買車,車款(不是落地價)直接到整千,千元以下直接抹零。但是你的工資從不抹零,也不會四舍五入。例如,你的工資9458.32元,我給你9000元或9400元,甚至9450元,你都會來找我。但是我給你9500元你可能就不說話了。
你想過沒有,如圖2-20,如果公司給我3萬元,讓我給三個人發(fā)工資,我發(fā)給張三9500元,發(fā)完李四的工資后,就不夠發(fā)王五了,只有保持精度,才能發(fā)完所有人的工資。

二、FLOAT單精度浮點(diǎn)數(shù)類型【4個字節(jié)】
我設(shè)計(jì)了一個表,就兩個字段,longtext類型我是存放我輸入的數(shù)據(jù)用于核對FLOAT數(shù)據(jù)類型,因?yàn)閱尉雀↑c(diǎn)數(shù)據(jù)類型會在滿足一定條件后,“改變”數(shù)據(jù)的精確度。圖2-21

我在表中【長文本】與【單精度浮點(diǎn)數(shù)據(jù)類型】兩個字段輸入相同數(shù)字,保存再打開后,會發(fā)現(xiàn)【單精度浮點(diǎn)數(shù)據(jù)類型】字段的值變了。如圖2-22

最終我們總結(jié)了一個道理,在FLOAT類型中存放的數(shù)字,不超過6個數(shù)字(與正負(fù)號和小數(shù)點(diǎn)無關(guān),只看數(shù)字)時,我們的數(shù)據(jù)精確度不變。
但是這個習(xí)慣不好,在這里用1、2、3、4、5、6、7是沒什么區(qū)別的,但是好習(xí)慣是用9

圖2-23
仍然是只能保持6個有效數(shù)字時精度不變,無論整數(shù)還是小數(shù),無論正數(shù)還是負(fù)數(shù)。為什么好習(xí)慣是用9,往后看DOUBLE雙精度就知道了。
FLOAT類型占用4個字節(jié),能保存整數(shù)和小數(shù),如果單純保存整數(shù),上節(jié)課講的MEDIUMINT類型只能保存整數(shù)占用3個字節(jié),最少能保存7位數(shù)(有符號時)。
所以說:FLOAT類型只有數(shù)據(jù)中可能會包含小數(shù)時才會使用,只能保存6個有效數(shù)字時精度不變。例如:工資就不適合保存這種類型,13258.28元使用FLOAT類型后會變成13258.3元。
如圖2-18所示,你左轉(zhuǎn)(FLOAT類型)遇到「和平精英」毒圈后的結(jié)果(變成什么值)不用考慮,你應(yīng)該做的是避開毒圈(不多于6位有效數(shù)字)。
三、DOUBLE雙精度浮點(diǎn)數(shù)類型【8個字節(jié)】
再做一張表,兩個字段

為什么用9測試,不相信我你用1測試,得到的結(jié)果肯定比我的位數(shù)多,但是你能保證你的數(shù)字不會達(dá)到上限嗎?我得到的結(jié)果位置比你少,但是準(zhǔn)備度有保證。好比,一條沒有分叉的路,不同地方高度不同,那么進(jìn)入這條路時,限高桿應(yīng)該以最低高度為限。如圖2-25

正數(shù)負(fù)數(shù)都是一樣的,我就沒再把圖帖出來,最終我總結(jié)了一張表:如圖2-26

如圖2-18所示,你右轉(zhuǎn)(DOUBLE類型)遇到「和平精英」毒圈后的結(jié)果(變成什么值)不用考慮,你應(yīng)該做的是避開毒圈(符合圖2-26的要求)。
Ps:從MySQL 8.0.17開始,官方文檔中明確FLOAT(M,D) 和DOUBLE(M,D)用法已不推薦使用,我將不再介紹相關(guān)內(nèi)容。你記得這兩個數(shù)據(jù)類型的長度和小數(shù)點(diǎn)這兩個參數(shù)默認(rèn)為0就好了。
浮點(diǎn)數(shù)類型雖然占用空間少,但是我仍不推薦你使用浮點(diǎn)數(shù)類型,因?yàn)樗鼈兪菙?shù)字,是數(shù)字就要進(jìn)行計(jì)算,你現(xiàn)在符合規(guī)則存好了,將來計(jì)算結(jié)果超出規(guī)則,也會被修改精度。
友情提示:我測試精度是基于 MySQL 8.0? 64位? ?+? Win10系統(tǒng),MySQL支持很多平臺,如果你使用小眾平臺或?qū)I(yè)平臺,建議自行測試。因?yàn)镕loat和Double默認(rèn)參數(shù)時,精度由計(jì)算機(jī)硬件和操作系統(tǒng)決定。
四、DECIMAL(M,D)定點(diǎn)數(shù)類型(占用空間不固定)
DECIMAL(M,D)? 翻譯:DECIMAL(長度,小數(shù)點(diǎn))

定點(diǎn)數(shù)類型優(yōu)點(diǎn):精確度高,不存在浮點(diǎn)數(shù)類型那樣修改精度的問題,比如:造航天飛機(jī)的數(shù)據(jù)就不能使用浮點(diǎn)數(shù)類型,這時定點(diǎn)數(shù)類型就是不錯的選擇。
定點(diǎn)數(shù)類型缺點(diǎn):占用存儲空間的大小取決于M和D,占用空間可能會比浮點(diǎn)數(shù)類型更大。
問:為什么定點(diǎn)數(shù)類型占用空間大呢?
答:算法問題,浮點(diǎn)數(shù)類型是直接把數(shù)存進(jìn)去,當(dāng)超過位數(shù)時,精確度會被修改。定點(diǎn)數(shù)類型是將整數(shù)部分和小數(shù)部分都轉(zhuǎn)化成整數(shù)保存,你看到的是小數(shù)。

DECIMAL默認(rèn)參數(shù)是:DECIMAL(10,0)
驗(yàn)證一下:當(dāng)你沒有設(shè)置長度和小數(shù)點(diǎn)時(全是0)圖2-29

保存后再進(jìn)入設(shè)計(jì)表,這里就會變成如圖2-30,這就是默認(rèn)

長度和小數(shù)點(diǎn)你可以調(diào)整參數(shù),長度最大65,小數(shù)點(diǎn)最大30,如果你的數(shù)超出范圍,是不讓你保存的。圖2-31

你將長度改成1都可以,如圖2-32

但是,在保存數(shù)據(jù)時,你輸入1位數(shù)沒問題,輸入2位數(shù),就會彈出錯誤。圖2-33

最后還要注意:小數(shù)的位數(shù)不能超過數(shù)字的總長度這個很好理解,所以D不能大于M。如圖2-34

MySQL神功文字版:https://www.bilibili.com/read/readlist/rl581425
更多學(xué)習(xí)視頻:https://www.bilibili.com/read/cv10222110