亚洲AV综合AV国产AV百度云-在线观看成人永久免费网站-人妻精品无码一区二区三区-亚洲AV无码理论亚洲毛片

您好,微網(wǎng)歡迎您! 登錄  |  注冊(cè)
汕頭公司 |  深圳公司              咨詢熱線:400-830-8248               微網(wǎng)優(yōu)點(diǎn)  |  視頻介紹 |  服務(wù)支持
開店咨詢
咨詢電話:400-830-8248
微網(wǎng)商學(xué)院
中國(guó)第一微商學(xué)院
網(wǎng)絡(luò)商學(xué)院
首頁 > 技術(shù)前沿
.NET中的十進(jìn)制浮點(diǎn)類型
文章出處:微網(wǎng)  更新時(shí)間:2011-11-04  點(diǎn)擊率:
.NET中的十進(jìn)制浮點(diǎn)類型

這篇文章給出了更多關(guān)于這個(gè)類型的細(xì)節(jié),包括它的表示和它與更多公共二進(jìn)制浮點(diǎn)類型的區(qū)別。從這開始,我應(yīng)該僅僅稱它為十進(jìn)制類型而不是System.Decimal, 這同樣是單精度浮點(diǎn)類型(float)和雙精度浮點(diǎn)類型(double)所提及的, 我的意思分別是指.NET 類型中的System.Single和System.Double. 為了讓這篇文章看起來很容易,我也將從這開始棄用正式類型中的名字。

什么是十進(jìn)制類型

十進(jìn)制類型僅是浮點(diǎn)數(shù)的另外一種表示形式 - 但是與單精度浮點(diǎn)類型和雙精度浮點(diǎn)類型不同,十進(jìn)制類型使用的進(jìn)制是10。如果你還沒有讀上面鏈接給出的文章,現(xiàn)在將會(huì)是讀它的最佳時(shí)間 - 我將不會(huì)在這篇文章中探討浮點(diǎn)類型數(shù)字。

十進(jìn)制類型于任何其他浮點(diǎn)數(shù)字有同樣的組件: 一個(gè)尾數(shù), 一個(gè)指數(shù)和一個(gè)符號(hào)。按照慣例, 符號(hào)位僅是一個(gè)比特,但是有96比特的尾數(shù)和5比特的指數(shù)位。然而,并不是所有指數(shù)組合都是合法的。只有值是0~28的才能工作,所有的負(fù)數(shù)也都是有效的: 數(shù)字值是符號(hào)*尾數(shù)/10指數(shù)。這意味著這個(gè)類型的最大值和最小值是+/-(296-1), 最小的非零數(shù)字在絕對(duì)值上是10-28.

指數(shù)被限制的原因是尾數(shù)可以存儲(chǔ)28或29個(gè)十進(jìn)制數(shù)字(取決于它自己的精度)。你可以將28個(gè)數(shù)字可以設(shè)置成任何你想要的值,你可以將十進(jìn)制浮點(diǎn)放在第一個(gè)數(shù)字的左邊到最后一個(gè)數(shù)字的右邊間的任何一個(gè)地方,(有一些你可以讓第29個(gè)數(shù)字在其余數(shù)字左邊的數(shù)字,但是由于限制,你不可以使用29個(gè)數(shù)字的所有組合。)它們都是有效的。

一個(gè)十進(jìn)制數(shù)是如何存儲(chǔ)的

一個(gè)十進(jìn)制數(shù)用128比特存儲(chǔ),盡管只有102比特是嚴(yán)格必須要有的。把十進(jìn)制數(shù)認(rèn)為是由尾數(shù)表示的3個(gè)32位整型數(shù)是很方便的,然后就可以用一個(gè)整數(shù)表示符號(hào)位和指數(shù)位。最后一個(gè)整數(shù)的最高位是符號(hào)位(在正式方式中,將最高位設(shè)置成(1)表示負(fù)數(shù))同時(shí)16~23位(高16位字的低位)表示指數(shù)。其他位必須都是(0). 這個(gè)表示是由decimal.GetBits(decimal)提供的可以返回一個(gè)4個(gè)整型數(shù)數(shù)組的方式。

格式化十進(jìn)制數(shù)

與單精度浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)不同,當(dāng).NET被要求將一個(gè)十進(jìn)制數(shù)格式化成一個(gè)字符串表示形式時(shí),它的默認(rèn)行為是給出精確值。這意味著二進(jìn)制浮點(diǎn)類型文章之中的DoubleConverter代碼 里提到的一個(gè)十進(jìn)制等效是沒有必要的。當(dāng)然,你可以用它來將值限制到一個(gè)特殊的精度。

保留0

在.NET 1.0 和1.1 間, 十進(jìn)制類型經(jīng)歷了一個(gè)微妙的變化?紤]下面的簡(jiǎn)單代碼:

view source

print?

using System;

public class Test

{

    static void Main()

    {

        decimal d = 1.00m;

        Console.WriteLine (d);

    }

}

當(dāng)我首先運(yùn)行上面的代碼時(shí)(或者一些類似的),我期待它輸出的結(jié)果是1(這是.NET 1.0中應(yīng)該有的結(jié)果)——但實(shí)際上,輸出是1.00。十進(jìn)制類型沒有使用它自己的標(biāo)準(zhǔn) - 它記住了它有多少個(gè)十進(jìn)制數(shù)字(通過維護(hù)可能的說明)并格式化,0可能被計(jì)入一個(gè)重要的十進(jìn)制數(shù)字。當(dāng)兩個(gè)不同的十進(jìn)制數(shù)相乘,相除,相加等等時(shí),我不知道選擇哪個(gè)說明(這里有一個(gè)選擇)的精確規(guī)則,但是當(dāng)你用如下的程序測(cè)試時(shí)你可能會(huì)發(fā)現(xiàn)它很有趣。

view source

print?

using System;

public class Test

{

    static void Main()

    {

        decimal d = 0.000 000 000 00010000m;

        while (d != 0m)

        {

            Console.WriteLine (d);

            d = d/5m;

        }

    }

}

它生成了一系列結(jié)果:

view source

print?

0.00000000000010000

0.00000000000002000

0.00000000000000400

0.00000000000000080

0.00000000000000016

0.000000000000000032

0.0000000000000000064

0.00000000000000000128

0.000000000000000000256

0.0000000000000000000512

0.00000000000000000001024

0.000000000000000000002048

0.0000000000000000000004096

0.00000000000000000000008192

0.000000000000000000000016384

0.0000000000000000000000032768

0.0000000000000000000000006554

0.0000000000000000000000001311

0.0000000000000000000000000262

0.0000000000000000000000000052

0.000000000000000000000000001

0.0000000000000000000000000002

所有的都是一個(gè)數(shù)字

十進(jìn)制類型沒有無窮大或者NaN(not-a-number, 不是一個(gè)數(shù)字)值,雖然上面例子里的同樣的真實(shí)數(shù)字隱含是不同格式(比如1, 1.0, 1.00),正常的==操作符考慮了這些并報(bào)告1.0==1.00.

精確性

在.NET中十進(jìn)制類型比任何內(nèi)建的浮點(diǎn)類型有更大的精度,盡管它有一個(gè)相對(duì)比較小的默認(rèn)指數(shù)范圍。很多操作使用二進(jìn)制浮點(diǎn)類型而沒有使用十進(jìn)制浮點(diǎn)類型來不精確的表示原始操作數(shù)卻獲得了讓人感覺驚訝的結(jié)果,精度是因?yàn)楹芏嗖僮髟谠创a中按照十進(jìn)制表示的。然而,那并不意味著所有操作突然變得精確起來: 1/3仍然是不完全表示的,例如,潛在的問題與二進(jìn)制浮點(diǎn)的問題一樣。然而,大多數(shù)時(shí)候十進(jìn)制類型用來計(jì)算總量,比如錢,操作很簡(jiǎn)單同時(shí)保持結(jié)果精確。(例如,添加一個(gè)由百分比表示的稅負(fù)將會(huì)讓數(shù)字精確,假設(shè)它們要在一個(gè)可以判斷的范圍內(nèi)開始。)僅需要注意哪些操作可能引起不精確,哪些操作不會(huì)。

作為一個(gè)非常廣泛的拇指(譯注: thumb 翻譯為拇指可能不準(zhǔn)確,以下類同)規(guī)則,如果你結(jié)束查看一個(gè)非常長(zhǎng)的字符串表示行為(比如大多數(shù)28/29位數(shù)字都是非零的)那么有可能你會(huì)在這個(gè)過程中得到一些不精確: 大多數(shù)對(duì)十進(jìn)制類型的使用不會(huì)再數(shù)字已經(jīng)精確的情況下仍然使用很多重要的數(shù)字來結(jié)束。

結(jié)論

大多數(shù)商業(yè)應(yīng)用應(yīng)該可能使用十進(jìn)制而不是單精度浮點(diǎn)或者雙精度浮點(diǎn)。我的拇指規(guī)則是由人類制作的值比如貨幣通常用十進(jìn)制浮點(diǎn)類型表示比較好: 例如,‘精確的1.25美元’這個(gè)的概念完全是有理由的。對(duì)來自自然世界的值,比如長(zhǎng)度和重量,二進(jìn)制浮點(diǎn)類型會(huì)更加有意義。盡管有一個(gè)理論的”精確 1.25米”但它不會(huì)真的在現(xiàn)實(shí)世界中發(fā)生: 你當(dāng)然不會(huì)去精確的測(cè)量長(zhǎng)度,而且它們也不像是能在原子層次中存在。我們通常有一個(gè)可以忍耐的范圍。

使用十進(jìn)制浮點(diǎn)算法需要花費(fèi)一個(gè)代價(jià),但是我認(rèn)為這對(duì)大多數(shù)開發(fā)人員來說不是瓶頸。總之,首先寫最合適(可讀)的代碼,一直分析你的代碼性能。通常慢一點(diǎn)獲得正確答案比很快卻得到錯(cuò)誤的答案更好。

聲明:本網(wǎng)部份文章為轉(zhuǎn)載文章,在每篇文章底部有說明,文章的觀點(diǎn)和立場(chǎng)僅代表作者個(gè)人立場(chǎng),不代表微網(wǎng)立場(chǎng),若是文章轉(zhuǎn)載中有侵范您的權(quán)益,請(qǐng)發(fā)郵件到 [email protected]或致電13922854199通知?jiǎng)h除,謝謝!

QQ咨詢  技術(shù)總監(jiān)  微網(wǎng)顧問  陳經(jīng)理  渠道經(jīng)理  

免費(fèi)電話 免費(fèi)熱線:400-830-8248  

微信咨詢  

注冊(cè)開店

代理加盟

返回頂部