日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

定点数类型

發(fā)布時(shí)間:2024/4/18 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 定点数类型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正因?yàn)橛酶↑c(diǎn)數(shù)表示小數(shù)可能會(huì)有不精確的情況,在一些情況下我們必須保證小數(shù)是精確的,所以設(shè)計(jì)MySQL的大叔們提出一種稱之為定點(diǎn)數(shù)的數(shù)據(jù)類型,它也是存儲(chǔ)小數(shù)的一種方式:

?

其中:

  • M表示該小數(shù)最多需要的十進(jìn)制有效數(shù)字個(gè)數(shù)。

注意是有效數(shù)字個(gè)數(shù),比方說對(duì)于小數(shù)**-2.3來說有效數(shù)字個(gè)數(shù)就是2,對(duì)于小數(shù)0.9來說有效數(shù)字個(gè)數(shù)就是1**。

  • D表示該小數(shù)的小數(shù)點(diǎn)后的十進(jìn)制數(shù)字個(gè)數(shù)。

這個(gè)好理解,小數(shù)點(diǎn)后有幾個(gè)十進(jìn)制數(shù)字,D的值就是什么。

舉個(gè)例子看一下,設(shè)置了MD的單精度浮點(diǎn)數(shù)的取值范圍的變化:

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

我們說定點(diǎn)數(shù)是一種精確的小數(shù),為了達(dá)到精確的目的我們就不能把它轉(zhuǎn)換成二進(jìn)制小數(shù)之后再存儲(chǔ)(因?yàn)橛泻芏嗍M(jìn)制小數(shù)轉(zhuǎn)為二進(jìn)制小數(shù)后需要進(jìn)行舍入操作,導(dǎo)致二進(jìn)制小數(shù)表示的數(shù)值是不精確的)。其實(shí)轉(zhuǎn)念一想,所謂的小數(shù)只是把兩個(gè)十進(jìn)制整數(shù)用小數(shù)點(diǎn)分割開來而已,我們只要把小數(shù)點(diǎn)左右的兩個(gè)十進(jìn)制整數(shù)給存儲(chǔ)起來,那不就是精確的了么。比方說對(duì)于十進(jìn)制小數(shù)2.38來說,我們可以把這個(gè)小數(shù)的小數(shù)點(diǎn)左右的兩個(gè)整數(shù),也就是238分別保存起來,那么不就相當(dāng)于保存了一個(gè)精確的小數(shù)么,這波操作是不是很6。

當(dāng)然事情并沒有這么簡(jiǎn)單,對(duì)于給定M、D值的**DECIMAL(M, D)類型,比如DEMCIMAL(16, 4)**來說:

  • 首先確定小數(shù)點(diǎn)左邊的整數(shù)最多需要存儲(chǔ)的十進(jìn)制位數(shù)是12位,小數(shù)點(diǎn)右邊的整數(shù)需要存儲(chǔ)的十進(jìn)制位數(shù)是4位,如圖所示:

  • 從小數(shù)點(diǎn)位置出發(fā),每個(gè)整數(shù)每隔9個(gè)十進(jìn)制位劃分為1組,效果就是這樣:

從圖中可以看出,如果不足9個(gè)十進(jìn)制位,也會(huì)被劃分成一組。

  • 針對(duì)每個(gè)組中的十進(jìn)制數(shù)字,將其轉(zhuǎn)換為二進(jìn)制數(shù)字進(jìn)行存儲(chǔ),根據(jù)組中包含的十進(jìn)制數(shù)字位數(shù)不同,所需的存儲(chǔ)空間大小也不同,具體見下表:

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

  • 第1組包含3個(gè)十進(jìn)制位,需要使用2個(gè)字節(jié)存儲(chǔ)。
  • 第2組包含9個(gè)十進(jìn)制位,需要使用4個(gè)字節(jié)存儲(chǔ)。
  • 第3組包含4個(gè)十進(jìn)制位,需要使用2個(gè)字節(jié)存儲(chǔ)。
    • 將轉(zhuǎn)換完成的比特位序列的最高位設(shè)置為1。

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

    1 234567890 1234

    也就是:

  • 第1組中包含整數(shù)1。
  • 第2組中包含整數(shù)234567890。
  • 第3組中包含整數(shù)1234。
  • 然后將每一組中的十進(jìn)制數(shù)字轉(zhuǎn)換成對(duì)應(yīng)的二進(jìn)制數(shù)字:

    • 第1組占用2個(gè)字節(jié),整數(shù)1對(duì)應(yīng)的二進(jìn)制數(shù)就是(字節(jié)之間實(shí)際上沒有空格,只不過為了大家理解上的方便我們加了一個(gè)空格):
    00000000 00000001

    二進(jìn)制看起來太難受,我們還是轉(zhuǎn)換成對(duì)應(yīng)的十六進(jìn)制看一下:

    0x0001
    • 第2組占用4個(gè)字節(jié),整數(shù)234567890對(duì)應(yīng)的十六進(jìn)制數(shù)就是:
    0x0DFB38D2
    • 第3組占用2個(gè)字節(jié),整數(shù)1234對(duì)應(yīng)的十六進(jìn)制數(shù)就是:
    0x04D2

    所以將這些十六進(jìn)制數(shù)字連起來之后就是:

    0x00010DFB38D204D2

    最后還要將這個(gè)結(jié)果的最高位設(shè)置為1,所以最終十進(jìn)制小數(shù)1234567890.1234使用定點(diǎn)數(shù)類型**DECIMAL(16, 4)**存儲(chǔ)時(shí)共占用8個(gè)字節(jié),具體內(nèi)容為:

    0x80010DFB38D204D2

    有的朋友會(huì)問,如果我們想使用定點(diǎn)數(shù)類型DECIMAL(16, 4)存儲(chǔ)一個(gè)負(fù)數(shù)怎么辦,比方說-1234567890.1234,這時(shí)只需要將0x80010DFB38D204D2中的每一個(gè)比特位都執(zhí)行一個(gè)取反操作就好,也就是得到下邊這個(gè)結(jié)果:

    0x7FFEF204C72DFB2D

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

    對(duì)于定點(diǎn)數(shù)類型DECIMAL(M, D)來說,MD都是可選的,默認(rèn)的M的值是10,默認(rèn)的D的值是0,也就是說下列等式是成立的:

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

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

    總結(jié)

    以上是生活随笔為你收集整理的定点数类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。