偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

開(kāi)發(fā) 后端
本文給出了更多關(guān)于.NET中十進(jìn)制浮點(diǎn)類(lèi)型的細(xì)節(jié),包括它的表示和它與更多公共二進(jìn)制浮點(diǎn)類(lèi)型的區(qū)別。從這開(kāi)始,我應(yīng)該僅僅稱它為十進(jìn)制類(lèi)型而不是System.Decimal, 這同樣是單精度浮點(diǎn)類(lèi)型(float)和雙精度浮點(diǎn)類(lèi)型(double)所提及的, 我的意思分別是指.NET 類(lèi)型中的System.Single和System.Double。

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

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

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

  十進(jìn)制類(lèi)型于任何其他浮點(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è)類(lèi)型的最大值和最小值是+/-(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)類(lèi)型文章之中的DoubleConverter代碼 里提到的一個(gè)十進(jìn)制等效是沒(méi)有必要的。當(dāng)然,你可以用它來(lái)將值限制到一個(gè)特殊的精度。

  保留0

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

  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í)(或者一些類(lèi)似的),我期待它輸出的結(jié)果是1(這是.NET 1.0中應(yīng)該有的結(jié)果)——但實(shí)際上,輸出是1.00。十進(jìn)制類(lèi)型沒(méi)有使用它自己的標(biāo)準(zhǔn) - 它記住了它有多少個(gè)十進(jìn)制數(shù)字(通過(guò)維護(hù)可能的說(shuō)明)并格式化,0可能被計(jì)入一個(gè)重要的十進(jìn)制數(shù)字。當(dāng)兩個(gè)不同的十進(jìn)制數(shù)相乘,相除,相加等等時(shí),我不知道選擇哪個(gè)說(shuō)明(這里有一個(gè)選擇)的精確規(guī)則,但是當(dāng)你用如下的程序測(cè)試時(shí)你可能會(huì)發(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)制類(lèi)型沒(méi)有無(wú)窮大或者NaN(not-a-number, 不是一個(gè)數(shù)字)值,雖然上面例子里的同樣的真實(shí)數(shù)字隱含是不同格式(比如1, 1.0, 1.00),正常的==操作符考慮了這些并報(bào)告1.0==1.00.

  精確性

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

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

  結(jié)論

  大多數(shù)商業(yè)應(yīng)用應(yīng)該可能使用十進(jìn)制而不是單精度浮點(diǎn)或者雙精度浮點(diǎn)。我的拇指規(guī)則是由人類(lèi)制作的值比如貨幣通常用十進(jìn)制浮點(diǎn)類(lèi)型表示比較好: 例如,‘精確的1.25美元’這個(gè)的概念完全是有理由的。對(duì)來(lái)自自然世界的值,比如長(zhǎng)度和重量,二進(jìn)制浮點(diǎn)類(lèi)型會(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ù)開(kāi)發(fā)人員來(lái)說(shuō)不是瓶頸??傊?,首先寫(xiě)最合適(可讀)的代碼,一直分析你的代碼性能。通常慢一點(diǎn)獲得正確答案比很快卻得到錯(cuò)誤的答案更好。

【編輯推薦】

  1. 1.5.2 十進(jìn)制轉(zhuǎn)換為二進(jìn)制
  2. 2.1.2 浮點(diǎn)類(lèi)型
  3. Asp.Net知識(shí)錦分享
  4. ASP.NET新手問(wèn)題總結(jié)
  5. 手把手教你實(shí)現(xiàn).NET程序打包
責(zé)任編輯:韓亞珊 來(lái)源: 博客園
相關(guān)推薦

2010-03-29 09:48:20

Ubuntu 10.1

2022-12-25 15:56:30

JavaScript字符串

2011-03-23 13:52:09

ORACLESQL十進(jìn)制

2009-07-28 16:03:23

ASP.NET狀態(tài)服務(wù)

2013-08-21 17:09:03

.Net屬性

2020-10-22 13:33:48

Java基礎(chǔ)入門(mén)

2017-06-04 15:24:31

BCD碼十進(jìn)制字符串

2009-12-04 09:14:05

.NET 4.0

2020-07-19 10:23:13

C++進(jìn)制常量

2021-12-01 07:32:24

微軟免費(fèi)工具PowerToys

2011-05-25 14:10:38

浮點(diǎn)數(shù)

2024-02-22 08:17:31

十六進(jìn)制數(shù)字計(jì)算

2011-06-08 13:50:39

C#類(lèi)型轉(zhuǎn)換

2021-08-10 09:34:58

漏洞語(yǔ)言混合進(jìn)制IP地址

2023-01-27 20:02:24

數(shù)值字符串二進(jìn)制

2009-07-23 13:23:53

ASP.NET編程

2009-07-23 13:00:37

ASP.NET編程

2023-11-08 18:05:06

Python類(lèi)型技巧

2023-12-22 15:23:04

Linux操作系統(tǒng)

2009-12-03 14:53:53

PHP浮點(diǎn)類(lèi)型取整
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)