成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET中的十進制浮點類型

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

  .NET中的十進制浮點類型

  首先,什么是十進制類型?

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

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

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

  一個十進制數(shù)是如何存儲的

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

  格式化十進制數(shù)

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

  保留0

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

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

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

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

  精確性

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

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

  結(jié)論

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

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

【編輯推薦】

  1. 1.5.2 十進制轉(zhuǎn)換為二進制
  2. 2.1.2 浮點類型
  3. Asp.Net知識錦分享
  4. ASP.NET新手問題總結(jié)
  5. 手把手教你實現(xiàn).NET程序打包
責(zé)任編輯:韓亞珊 來源: 博客園
相關(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十進制

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ǔ)入門

2017-06-04 15:24:31

BCD碼十進制字符串

2009-12-04 09:14:05

.NET 4.0

2020-07-19 10:23:13

C++進制常量

2021-12-01 07:32:24

微軟免費工具PowerToys

2011-05-25 14:10:38

浮點數(shù)

2024-02-22 08:17:31

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

2021-08-10 09:34:58

漏洞語言混合進制IP地址

2011-06-08 13:50:39

C#類型轉(zhuǎn)換

2023-01-27 20:02:24

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

2023-11-08 18:05:06

Python類型技巧

2009-07-23 13:00:37

ASP.NET編程

2009-07-23 13:23:53

ASP.NET編程

2023-12-22 15:23:04

Linux操作系統(tǒng)

2009-12-03 14:53:53

PHP浮點類型取整
點贊
收藏

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

主站蜘蛛池模板: 男女啪啪网址 | 国产精品毛片一区二区在线看 | 99久久精品国产一区二区三区 | 国产玖玖| 一区二区视频 | 九九久久精品视频 | 91九色婷婷 | 91在线精品视频 | 成人黄色在线 | 三级av在线 | 婷婷久久五月 | 精品国产18久久久久久二百 | 欧美一级三级在线观看 | 欧美在线一二三 | 国产精品99999999 | 久久久久久国模大尺度人体 | 国产一级免费视频 | 性色av一区 | 中文精品视频 | 精品国产一区二区三区久久狼黑人 | 日韩高清国产一区在线 | 在线国产小视频 | 无码一区二区三区视频 | 操皮视频 | 欧美一区二区免费视频 | 精品视频一区二区 | 久久国产精品99久久久大便 | 国产精品 亚洲一区 | 91精品综合久久久久久五月天 | 国产成人在线看 | 亚洲v日韩v综合v精品v | 伊人精品在线视频 | 久久99精品国产麻豆婷婷 | 中文字幕在线视频一区二区三区 | 国产精品成人在线观看 | 在线播放亚洲 | 国产在线视频一区 | 亚洲天堂二区 | 欧美日韩国产传媒 | 国产精品爱久久久久久久 | 精品国产一区二区三区性色av |