日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
.NET中的十進(jìn)制浮點(diǎn)類型

  .NET中的十進(jìn)制浮點(diǎn)類型

  首先,什么是十進(jìn)制類型?

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

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

  指數(shù)被限制的原因是尾數(shù)可以存儲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ù)是如何存儲的

  一個(gè)十進(jìn)制數(shù)用128比特存儲,盡管只有102比特是嚴(yán)格必須要有的。把十進(jìn)制數(shù)認(rèn)為是由尾數(shù)表示的3個(gè)32位整型數(shù)是很方便的,然后就可以用一個(gè)整數(shù)表示符號位和指數(shù)位。最后一個(gè)整數(shù)的最高位是符號位(在正式方式中,將最高位設(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è)微妙的變化。考慮下面的簡單代碼:

 
 
 
  1. view source   
  2. print?   
  3. using System;   
  4. public class Test   
  5. {   
  6.     static void Main()   
  7.     {   
  8.         decimal d = 1.00m;   
  9.         Console.WriteLine (d);   
  10.     }  
  11. }   

  當(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)你用如下的程序測試時(shí)你可能會發(fā)現(xiàn)它很有趣。

 
 
 
  1. view source   
  2. print?   
  3. using System;   
  4. public class Test   
  5. {   
  6.     static void Main()   
  7.     {   
  8.         decimal d = 0.000 000 000 00010000m;   
  9.         while (d != 0m)   
  10.         {   
  11.             Console.WriteLine (d);   
  12.             dd = d/5m;   
  13.         }   
  14.     }   
  15. }   

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

 
 
 
  1. view source  
  2. print?  
  3. 0.00000000000010000  
  4. 0.00000000000002000  
  5. 0.00000000000000400  
  6. 0.00000000000000080  
  7. 0.00000000000000016  
  8. 0.000000000000000032  
  9. 0.0000000000000000064  
  10. 0.00000000000000000128  
  11. 0.000000000000000000256  
  12. 0.0000000000000000000512  
  13. 0.00000000000000000001024  
  14. 0.000000000000000000002048  
  15. 0.0000000000000000000004096  
  16. 0.00000000000000000000008192  
  17. 0.000000000000000000000016384  
  18. 0.0000000000000000000000032768  
  19. 0.0000000000000000000000006554  
  20. 0.0000000000000000000000001311  
  21. 0.0000000000000000000000000262  
  22. 0.0000000000000000000000000052  
  23. 0.000000000000000000000000001  
  24. 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è)相對比較小的默認(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ì)算總量,比如錢,操作很簡單同時(shí)保持結(jié)果精確。(例如,添加一個(gè)由百分比表示的稅負(fù)將會讓數(shù)字精確,假設(shè)它們要在一個(gè)可以判斷的范圍內(nèi)開始。)僅需要注意哪些操作可能引起不精確,哪些操作不會。

  作為一個(gè)非常廣泛的拇指(譯注: thumb 翻譯為拇指可能不準(zhǔn)確,以下類同)規(guī)則,如果你結(jié)束查看一個(gè)非常長的字符串表示行為(比如大多數(shù)28/29位數(shù)字都是非零的)那么有可能你會在這個(gè)過程中得到一些不精確: 大多數(shù)對十進(jìn)制類型的使用不會再數(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è)的概念完全是有理由的。對來自自然世界的值,比如長度和重量,二進(jìn)制浮點(diǎn)類型會更加有意義。盡管有一個(gè)理論的”精確 1.25米”但它不會真的在現(xiàn)實(shí)世界中發(fā)生: 你當(dāng)然不會去精確的測量長度,而且它們也不像是能在原子層次中存在。我們通常有一個(gè)可以忍耐的范圍。

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


本文標(biāo)題:.NET中的十進(jìn)制浮點(diǎn)類型
文章網(wǎng)址:http://www.5511xx.com/article/ccojooe.html