簡體   English   中英

C#-數值變量類型-基數2 /基數10表示法

[英]C# - Numeric Variable Types - Base 2/Base 10 notations

有一件小事讓我在C#中感到困惑:)

這是我的變量和結果:

decimal a1 = 0.2M;
decimal a2 = 1.0M;

a1 - a2 = -0.8

float b1 = 0.2F;
float b2 = 1.0F;

b1 - b2 = -0.8

double c1 = 0.2;
double c2 = 1.0;

c1 - c2 = -0.8

double x1 = 0.2F;
double x2 = 1.0F;

x1 - x2 = -0.799999997019768

十進制 -結果出乎我的意料,知道它們以10為基數表示法。

浮點 -驚訝我,知道它的工作原理的基礎上記號2實際上顯示的結果,如果它的工作作為基地10符號與出失去精度。

Double c-與Float相同。

Double x-顯示我希望Float發生的結果。

問題是FloatDouble'c''x'組發生了什么? 為什么Double'x'組會失去精度,而Float組實際上是以10為基數來計算的,所以可以說計算得出“預期”結果? 想知道為什么將Double x組的數字類型聲明為F從而徹底改變了它的類型嗎?

對於什么值,我只希望數組能給我“ -0.8”結果,而其他所有東西都能給“ -0.799999997019768”。

似乎我在計算的方式上缺少一些了解的聯系。

首先-與基數2與基數10無關。所有值都以基數10表示。此代碼中未使用基數2。

似乎我在計算的方式上缺少一些了解的聯系。

floatdouble float都使用浮點數表示形式,但並非100%准確。 顯示值時,將進行四舍五入。 由於float本質上具有較低的精度,因此會四舍五入到更少的小數點,這會使它在某些情況下“顯示”更准確(即使實際上不那么精確)。

在您的情況下,“ x”組和“ c”組顯示不同的原因是,您要聲明x1和x2變量,如下所示:

double x1 = 0.2F;
double x2 = 1.0F;

實際上,這與執行以下操作相同:

float temp = 0.2f;
double x1 = temp; // Convert from float to double, which has a loss of precision
temp = 1f;
double x2 = temp; // Convert from float to double, which has a loss of precision

因此, x1x2的值與c1c2不完全相同。 這會導致更多的精度損失,隨后當發生減法時,精度足以使打印不再舍入。

如果您想真正理解這一點, 那么好的閱讀文章是每位計算機科學家都應該了解的浮點運算法則 大多數常見的編程語言都對浮點數使用類似的表示形式,因此這些問題相當普遍。

在C#中,長期以來引起程序員困惑的原因是,語言規范允許對浮點值進行的大多數中間操作都可以以更高的精度執行 編譯器通常這樣做是為了加快速度,因為許多處理器以這種方式更快。 我不太清楚具體的細節(如果我錯了,確實可以隨意糾正我的人),但是b部分中的計算似乎使用了這種額外的精度。

x組中, double精度變量已經具有更高的精度,但是將float型常量放入其中可能會導致編譯器的行為有所不同,從而導致結果的精度降低。 由於double精度數已經偏離了應有的位置,因此全精度精度只是將誤差向前推。

最終,C#中的浮點精度根本不是要明確依賴的東西,因為編譯器有很多余地可以根據自己的選擇進行一些微調,但是只要能提供最少的數量,它就會認為是最佳的規范中闡明的精度。

哦,這與基數2沒有任何關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM