.net - float vs double java




.NET中decimal,float和double的區別? (12)

  1. 在編譯和運行時,double和float都可以被整數零除。
  2. 十進制不能被整數零除。 如果你這樣做,編譯將會失敗。

.NET中的decimalfloatdouble什麼區別?

什麼時候會有人使用其中之一?


Decimal,Double和Float變量類型的存儲方式不同。 float是單精度(32位)浮點數據類型,double是雙精度(64位)浮點數據類型,decimal是128位浮點數據類型時,精度是主要區別。

浮點 - 32位(7位數字)

雙64位(15-16位)

十進制 - 128位(28-29位有效數字)

主要區別是Floats和Doubles是二進制浮點類型,Decimal會將該值存儲為浮點小數點類型。 所以小數具有更高的精度,通常用於需要高度準確性的貨幣(金融)或科學計算應用中。 但在性能方面,小數比雙精度和浮點類型慢。

十進制可以100%準確地表示小數格式精度內的任何數字,而Float和Double不能準確表示所有數字,即使在各自格式精度範圍內的數字也不能準確表示。

十進制

在財務應用或科學計算的情況下,最好使用十進制類型,因為它為您提供了高度的準確性,並且易於避免舍入誤差

除了處理金錢外,雙重類型可能是實際值最常用的數據類型。

浮動

它主要用於圖形庫,因為對處理能力的要求非常高,也使用了可以忍受舍入誤差的情況。


float 7位精度

double精度約為15位

decimal有大約28個數字的精度

如果您需要更高的準確度,請使用double而不是float。 在現代CPU中,兩種數據類型的性能幾乎相同。 使用浮動的唯一好處是他們佔用更少的空間。 實際上只有當你有很多人時才有意義。

我發現這很有趣。 每位計算機科學家應該了解的浮點算法


floatdouble浮點二進制點類型 。 換句話說,他們代表了這樣一個數字:

10001.10010110011

二進制數和二進制點的位置都在該值內編碼。

decimal浮點小數點類型 。 換句話說,他們代表了這樣一個數字:

12345.65789

同樣, 小數點的位置和數字都被編碼在這個值中 - 這就是decimal仍然是浮點類型而不是固定點類型。

重要的是要注意的是,人類習慣用十進制形式表示非整數,並期望十進製表示中的確切結果; 並非所有的十進制數都可以在二進制浮點數中精確表示 - 例如0.1 - 所以如果使用二進制浮點數值,則實際上會得到0.1的近似值。 例如,當使用浮動小數點時,您仍會得到近似值 - 例如,除以1除以3的結果不能被精確表示。

至於什麼時候使用:

  • 對於“自然精確小數”的值,使用decimal是很好的。 這通常適用於人類發明的任何概念:金融價值是最明顯的例子,但也有其他概念。 例如,考慮給予潛水員或溜冰者的分數。

  • 對於自然界更多的人為因素,無論如何都無法準確衡量, float / double點更合適。 例如,科學數據通常以這種形式表示。 在這裡,原始值不會以“小數精度”開始,所以對於預期結果來說,保持“小數精度”並不重要。 浮點二進制點類型比小數點處理速度快得多。


如前所述,整數是整數。 他們不能存儲點,例如.7,.42和.007。 如果你需要存儲不是整數的數字,你需要一個不同類型的變量。 您可以使用雙精度型或浮點型。 您可以使用完全相同的方式設置這些類型的變量:不是使用int這個詞,而是輸入doublefloat 。 喜歡這個:

float myFloat;
double myDouble;

float是“浮點數”的縮寫,只是意味著一個數字有一點點到底。)

兩者之間的差異在於它們可以容納的數字的大小。 對於float ,您的號碼最多可以有7位數字。 對於double s,最多可以有16位數字。 更確切地說,這是官方規模:

float:  1.5 × 10^-45  to 3.4 × 10^38  
double: 5.0 × 10^-324 to 1.7 × 10^308

float是一個32位數字, double是一個64位數字。

雙擊您的新按鈕以查看代碼。 將以下三行添加到您的按鈕代碼中:

double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());

暫停您的程序並返回編碼窗口。 改變這一行:

myDouble = 0.007;
myDouble = 12345678.1234567;

運行你的程序並點擊雙擊按鈕。 消息框正確顯示數字。 儘管如此,在結尾添加另一個數字,C#將再次向上或向下舍入。 道德是如果你想要的準確性,小心四捨五入!


它們之間的主要區別在於精度。

float是一個32-bit數字, double是一個64-bit數字, decimal是一個128-bit數字。


對於內存和性能都很關鍵的遊戲和嵌入式系統等應用來說,float通常是數字類型的選擇,因為它更快,而且是double的一半。 整數曾經是選擇的武器,但浮點性能在現代處理器中已經超過了整數。 十進制是正確的!


我不會重複在其他答案和評論中已經回答的大量好的(和一些不好的)信息,但我會用提示回答你的後續問題:

什麼時候會有人使用其中之一?

數值使用小數

使用float / double作為測量

一些例子:

  • 錢(我們數錢還是衡量金錢?)

  • 距離(我們計算距離還是測量距離?*)

  • 分數(我們計數分數還是分數?)

我們總是數錢,不應該衡量它。 我們通常測量距離。 我們經常計數分數。

*在某些情況下,我稱之為標稱距離 ,我們可能確實希望“計數”距離。 例如,也許我們正在處理顯示到城市的距離的國家標誌,並且我們知道這些距離永遠不會有超過一個十進制數字(xxx.x km)。


沒有人提到過

在默認設置中,Floats(System.Single)和double(System.Double)永遠不會使用溢出檢查,而Decimal(System.Decimal)將始終使用溢出檢查。

我的意思是

decimal myNumber = decimal.MaxValue;
myNumber += 1;

拋出OverflowException

但是這些不會:

float myNumber = float.MaxValue;
myNumber += 1;

double myNumber = double.MaxValue;
myNumber += 1;

浮動〜±1.5×10-45至±3.4×1038 -------- 7個數字
雙±5.0 x 10-324至±1.7 x 10308 ------ 15或16位數字
小數點〜±1.0×10-28至±7.9×1028 -------- 28或29位數字


精度是主要區別。

Float - 7位數字(32位)

Double 15-16位(64位)

Decimal -28-29有效數字(128位)

小數具有更高的精度,通常用於需要高度準確性的財務應用程序中。 小數點比雙/浮點數慢得多(在一些測試中高達20倍)。

小數和浮動/雙打無法比較沒有投,而浮動和雙打可以。 小數也允許編碼或尾隨零。

float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);

結果:

float: 0.3333333  
double: 0.333333333333333  
decimal: 0.3333333333333333333333333333





decimal