c中decimal,double,float的區別

2023-01-03 13:21:03 字數 2659 閱讀 5376

浮點型如果我們在**中寫乙個12.3,編譯器會自動認為這個數是個double型。所以如果我們想指定12.3為float型別,那麼你必須在數字後面加上f/f:

float f = 12.3f;

decimal型別

作為補充,decimal型別用來表示高精度的浮點數

從上表可以看出,decimal的有效位數很大,達到了28位,但是表示的資料範圍卻比float和double型別小。decimal型別並不是c#中的基礎型別,所以使用的時候會對計算時的效能有影響。

我們可以像如下的方式定義乙個decimal型別的浮點數:

decimal d = 12.30m;

對decimal、float、double錯誤的認識

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

考慮下面的語句:

double dd = 10000000000000000000000d;

dd += 1;

( "", dd );

輸出是什麼?誰知道?

輸出是:1000000000000000000000000

這就是浮點數精度損失的問題,最重要的是,在精度損失的時候,不會報告任何的錯誤,也不會有任何的異常產生。

浮點數的精度損失可能在很多地方出現,例如d * g / g 不一定等於d,d / g * g也不一定等於d。

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

1、decimal不是浮點型、decimal不存在精度損失。

下面有段程式大家可以去看看結果是什麼。記住!所有的浮點型變數都存在精度損失的問題,而decimal是乙個不折不扣的浮點型,不論它精度有多高,精度損失依然存在!

decimal dd = 10000000000000000000000000000m;

dd += 0.1m;

( "", dd );

2、decimal所能儲存的數比double大,從double到decimal的型別轉換不會出現任何問題。

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

「decimal 型別是適合財務和貨幣計算的 128 位資料型別。」

當然,decimal在大多數情況下是安全的,但浮點數在理論上是不安全的。

至於精度誤差造成的顯示問題,則是很容易修補的。浮點數會帶來的問題以及整型能避免的問題就是乙個:

譬如說從a帳戶轉賬到b帳戶,經計算得出結果是3.788888888888888元,那麼我們從a帳戶扣除這麼多錢,b帳戶增加這麼多錢,但事實上a帳戶不一定會扣除準確的數值,例如a帳戶的金額在100000000000,那麼這個時候100000000000 - 3.788888888888888運算結果很有可能是99999999996.

211111而這個時候b帳戶的金額為0則很有可能加上準確的數值,如3.788888888888888,這樣一來,0.011111111111112元錢就會不見了,日積月累的,差額就會越來越大。

double是64位的,比single-32位精度高

decimal128位高精度浮點數,常用於金融運算,不會出現浮點數計算的誤差

,decimal 型別具有更高的精度和更小的範圍,這使它適合於財務和貨幣計算。

早上剛到辦公室,就被中試室打來**叫去,原來軟體在測試過程中發現了個小問題:軟體讀出來的資料比裝置lcd上顯示資料小了 0.01 。

怎麼會這樣呢,資料型別我已經用了 double 型了整個資料長度也就6位,double型的資料有效資料位為7位,也夠了阿,不明白。於是回來下斷點跟蹤。

前面double型在算的時候,是沒問題的,資料是66.24,可是當我把66.24 乘上100後的處理結果就不對了:

66.24*100.0d = 6623.

9999…91,問題就出在這裡了。查了msdn,double型的資料:double 值型別表示乙個值介於 -1.

79769313486232e308 和 +1.79769313486232e308 之間的雙精度 64 位數字,浮點數只能近似於十進位制數字,浮點數的精度決定了浮點數近似於十進位制數字的精確程度。預設情況下,double 值的精度是 15 個十進位制位,但內部維護的最大精度是 17 位。

所以就出現了乘上一百後,精度就不夠了。又由於我們在處理資料時,是不允許四捨五入的,所以,經過單位轉換後,軟體中最終顯示的資料為 66.23 ,比lcd上顯示的66.

24 小了 0.01。

因此,這之後就想到了應該用更高精度的 decimal 型。

在宣告decimal型別資料時,可以 a: decimal mydata = 100,此時編譯器隱式轉換整型數100為 100.0m;當然也可以b:

decimal mydata = 100.0m,但是如果是 decimal mydata = 100.0d或者decimal mydata = 100.

0f,就不行了,因為100.0d或者100.0f,編譯器認為是浮點數,而浮點數和decimal 型別之間不存在隱式轉換;因此,必須使用強制轉換在這兩種型別之間進行轉換。

this is the important,否則編譯器便報錯。所以一般的財務軟體在處理時,都會用decimal 型別。

好了,改用decimal 型之後,就ok 了,結果就完完整整地顯示為 66.24 了。

c和c 中const用法總結

const型別定義 指明變數或物件的值是不能被更新,引入目的是為了取代預編譯指令 常量必須被初始化 cons的作用 1 可以定義const常量例如 constintmax 100 intarray max 2 便於進行型別檢查例如 voidf constinti 編譯器就會知道i是乙個常量,不允許修...

C和C 中const的用法異同總結

c中const的用法總結起來主要分為以下兩種 1 在定義變數時使用 由於const常量在定義後不能被修改,所以在定義時一定要進行初始化操作 a 最簡單的用法,說明變數為乙個常變數 在以下例子裡,int 和const的先後順序可以改變的,這無所謂 const int a 100 int const b...

C 中const用法總結

c 中const用法總結 月光林地 部落格園 修飾普通變數和指標 const修飾變數,一般有兩種寫法 consttypevalue typeconstvalue 這兩種寫法在本質上是一樣的。它的含義是 const修飾的型別為type的變數value是不可變的。對於乙個非指標的型別type,無論怎麼寫...