你可能不知道的MySQL中的定點數型別

2021-09-27 05:22:40 字數 2366 閱讀 6889

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

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

這個好理解,小數點後有幾個十進位制數字,d的值就是什麼。

舉個例子看一下,設定了md的單精度浮點數的取值範圍的變化:

可以看到,在d相同的情況下,m越大,該型別的取值範圍越大;在m相同的情況下,d越大,該型別的取值範圍越小。當然,md的取值也不是無限大的,m的取值範圍是1~255d的取值範圍是0~30,而且d的值必須不大於mmd都是可選的,如果我們省略了它們,那它們的值按照機器支援的最大值來儲存。

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

當然事情並沒有這麼簡單,對於給定m、d值的decimal(m, d)型別,比如demcimal(16, 4)來說:

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

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

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

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

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

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

1 234567890 1234
也就是:

第1組中包含整數1。

第2組中包含整數234567890。

第3組中包含整數1234。

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

對於定點數型別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

你可能不知道的東西

元素可以分為塊級元素,行內元素以及行內塊級元素。行內元素的margin或者padding只有margin left和margin right以及padding left和padding right有效果,margin top margin bottom padding top padding bot...

你可能不知道的const

眾所周知,使用 const 宣告的變數必須同時初始化為某個值。一經宣告,在其生命週期的任何時候都不能再重新賦予新值 const a syntaxerror 常量宣告時沒有初始化 const b 3 console.log b 3 b 4 typeerror 給常量賦值const 宣告只應用到頂級原語...

你可能不知道的python logging機制

先來看幾個例子,先想一下執行結果,答案稍後揭曉 例一 mylogger logging.getlogger mylogger mylogger.info mylogger info mylogger.warning mylogger warning 例二 mylogger logging.getlo...