1. 程式人生 > >float,double,decimal的區別於誤解

float,double,decimal的區別於誤解

在精確計算中使用浮點數是非常危險的,儘管C#在浮點數運算時採取了很多措施使得浮點數運算的結果看起來是非常正常的。但實際上如果不清楚浮點數的特性而貿然使用的話,將造成非常嚴重的隱患。 


 考慮下面的語句:  
   
             double  dd  =  10000000000000000000000d;  
             dd  +=  1;  
             Console.WriteLine  (  "{0:G50}",  dd  );  
   
 輸出是什麼?誰知道?  
 輸出是:1000000000000000000000000  
   
 這就是浮點數精度損失的問題,最重要的是,在精度損失的時候,不會報告任何的錯誤,也不會有任何的異常產生。  
 浮點數的精度損失可能在很多地方出現,例如d  *  g  /  g  不一定等於d,d  /  g  *  g也不一定等於d。  

應該是decimal的精度是double的兩倍,float(single)的四倍吧 decimal的精度是double的兩倍,float(single)的四倍,

就大小而言,decimal還不及float吧

型別     大致範圍                                 精度
----------------------------------------------------------------
float    ±1.5 × 10^(−45) 到 ±3.4 × 10^38      7 位 
double   ±5.0 × 10^(−324) 到 ±1.7 × 10^308    15 到 16 位 
decimal  ±1.0 × 10^(−28) 到 ±7.9 × 10^28      28 到 29 位有效位

還有兩個非常危險的錯誤認識!! 

 1、decimal不是浮點型、decimal不存在精度損失。  
 下面有段程式大家可以去看看結果是什麼。記住!所有的浮點型變數都存在精度損失的問題,而decimal是一個不折不扣的浮點型,不論它精度有多高,精度損失依然存在!  
   
                 decimal  dd  =  10000000000000000000000000000m;  
                 dd  +=  0.1m;  
                 Console.WriteLine  (  "{0:G50}",  dd  );  
   
2、decimal所能儲存的數比double大,從double到decimal的型別轉換不會出現任何問題。

  

 微軟在decimal的幫助上真的要好好反省了。實際上只有從整形到decimal的轉換才是擴大轉換,decimal的精度比double大,但所能儲存的最大數卻比double要小。


相關推薦

floatdoubledecimal區別誤解

在精確計算中使用浮點數是非常危險的,儘管C#在浮點數運算時採取了很多措施使得浮點數運算的結果看起來是非常正常的。但實際上如果不清楚浮點數的特性而貿然使用的話,將造成非常嚴重的隱患。   考慮下面的語句:      

C#中對於floatdoubledecimal誤解(轉載)

財務 log targe ext 帳戶 href table 報告 border 浮點型 Name CTS Type Description Significant Figures Range (approximate)

c語言:輸出以下關鍵字的位元組大小及輸出一個地址:charshortintfloatdoublelong

輸出以下關鍵字的位元組大小及輸出一個地址: 1. #include<stdio.h> int main() { printf("%d\n",sizeof(char));//1 printf(

Sql中decimalfloatdouble型別的區別與用法

三者的區別介紹 float:浮點型,含位元組數為4,32bit,數值範圍為-3.4E38~3.4E38(7個有效位) double:雙精度實型,含位元組數為8,64bit數值範圍-1.7E308~1.7E308(15個有效位) decimal:數字型,128bit,不存

C++學習筆記——string型 到 intdoublefloat型的相互轉換:ostringsreamistringstreamstringstream

標頭檔案:#include<sstream> istringstream類:用於執行C++風格的串流的輸入操作。 ostringstream類:用於執行C風格的串流的輸出操作。 s

C#中int、long、floatdoubledecimal最大值最小值

最近在將java上寫的一個簡單的表示式求值計算器移植到Windows Phone 8,java中double的精度問題是很明顯的,解決辦法是改用BigDecimal類。所以覺得C#中用double也是不太好的。 C#中用作精度計算的一個數據型別是decimal,對應的類是D

floatdouble有什麼區別

float和double在遊戲行業肯定是用的很多的,雖然這是個很基礎的問題,但是面試時被問到還是感覺說的不是很好。 所以還是總結一下: float 單精度浮點數在機內佔 4 個位元組,用 32 位二進位制描述。 double 雙精度浮點數在機內佔 8 個位元組,用 64 位二進位制描述。 浮點數在機內用

C#中decimaldoublefloat區別

float 單精度浮點 32bit,double 雙精度浮點64bit,decimal是高精度 128bit,浮點型。float double 是 基本型別(primitive type),decimal不是。float 有效數字7位,範圍 ±1.5 × 10E−45 to ±3.4 ×

java小數運算內附現成的工具類。不能用doublefloat要用decimal

https://www.cnblogs.com/xujishou/p/7491932.h 為什麼會出現這個問題呢,就這是java和其它計算機語言都會出現的問題,下面我們分析一下為什麼會出現這個問題: float和double型別主要是為了科學計算和工程計算而設計的。他們執行二進位制浮點運算,這是

floatdouble區別以及float為什麼要加f

單精度浮點數(float)與雙精度浮點數(double)的區別如下:(1)在記憶體中佔有的位元組數不同單精度浮點數(float)在機內佔4個位元組雙精度浮點數(double)在機內佔8個位元組(2)有效數字位數不同單精度浮點數(float)有效數字8位雙精度浮點數(doubl

c語言floatdouble型別的理解

float:1bit(符號位)+8bit(指數位,範圍-128~127)+23bit(尾數位) double:1bit + 11bit + 52bit 例:8.25(十進位制) -----> 1000.01(二進位制)   //1x2^3 +1x2^(-2)=8.2

C#之基礎篇①(VS快捷鍵、WriteLine()與Write()區別、ReadKey()與ReadLine()區別double,float,decimal區別

     今天我們來分享一下VS視訊中第一講內容,這篇內容主要分享的是VS工具的使用以及簡單的資訊顯示、變數宣告。 一、導圖類: 二、程式碼類 2.1、顯示資訊 Console.WriteLine("************

floatdouble精度

Double與float型別 (1)基本儲存方式:與int、long儲存方式不同,double與float在記憶體中是以符號位、指數位與尾數位三部分進行儲存的,其中符號位表示數字分正負,佔位1位;指數位表示浮點的位置,佔位8位,無符號儲存,取值範圍:0-256,其與實際指數的偏差值為127,

自動機狀態機有限自動機有限狀態機有限狀態自動機非確定下有限狀態自動確定性有限狀態自動機的區別聯絡

這幾個概念暈了幾天了,搞明白了就來備註一下 FSM(Finite State Machine) FAM(Finite Automata Machine) DFA(Determinate Finite Automata) NFA(Non-Determinate Finite

mysql float double decimal 區別

MySQL is the Most Popular Database Software when it comes to Websites. All Popular Content Management Systems work with MySQL like WordPress, vBulletin, D

相關性、因果性之間的區別聯絡以及為什麼說相關性不是因果性?

1. 相關性是什麼? 0x1:相關性的定義 X和癌症有關,Y和中風有關,Z和心臟病發作有關。這三句話描述了三個相關性,告訴我們彼此的兩個現象是相關的,卻沒說它們是如何關聯在一起的。 兩個變數相關的基本意思是,一個變數發生的變化與另一個變數發生的變化是隨時間同步關聯的。比如: 孩子們的身高和年齡相關,因為隨著

雖然關閉了VR電影工作室但是Facebook依然致力虛擬現實

們的 height ora 創作 env 堅持 sof content 數字 原文標題:雖然關閉了VR電影工作室,但是Facebook依然致力於虛擬現實 Facebook的旗下Oculus在近日已經表示將關閉其虛擬制作部門Story Studio。 “我們現在正在進入V

遠程通信的幾種選擇(RPCWebserviceRMIJMS的區別

抽象 接口 sent res 平臺 subscribe 支持 遠程服務 ava RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http協議,發送請求到服務器,等待服務器返回結果。這個請求包括一個參數集和一個文本集,通常形成

javascript中的innerHTMLinnerTextouterHTML的用法及其區別

document 去除html標簽 cnblogs class 示例 scrip ie7 及其 描述 示例html代碼: <div id="test"> <span style="color:red">test1</span>

關於offsetXclientXpageX,offsetHeightclientHeight ,scrollHeightX的區別

關於 -a blog 高度 logs 變化 http 狀態欄 技術分享 一、關於offsetX,clientX,pageX,scrollX的區別   offsetX表示點擊點到所點擊物體左邊距的距離;   clientX表示點擊點到瀏覽器左邊的距離,該點擊點會隨著滾動條的移