簡體   English   中英

將 double 轉換為 float 出錯 - C#

[英]Convert double to float goes wrong - C#

我需要計算rectangleF類型的界限

由於某種原因,從doublefloat的轉換沒有按照應有的方式精確評估

這是這種計算的一個例子


float MinX = 0f, MaxX = 0f;
float MinY = 0f, MaxY = 0f;
float BoundsWidth = 0.2f;
float BoundsHeight = 0.1f;
double BoundsY = 2333638.6551984739;
double BoundsX = 895.0999755859375;

MinX = (float)BoundsX;
MinY = (float)BoundsY;

var MaxX_Defect = BoundsX + BoundsWidth;
var MaxY_Defect = BoundsY + BoundsHeight;
MaxX = (float)(MaxX_Defect);
MaxY = (float)(MaxY_Defect);

當我試圖計算高度MaxY-MinY它被評估為0而不是0.1f

我怎樣才能解決這個問題?

float BoundsHeight = 0.1f; converts.1 為float中可表示的最接近的值,導致BoundsHeight為 0.100000001490116119384765625

double BoundsY = 2,333,638.6551984739; 同樣轉換為double ,將BoundsY設置為 2,333,638.6551984739489853382110595703125。

float MinY = BoundsY; 將其轉換為float ,將 MinY 設置為MinY

double MaxY_Defect = BoundsY + BoundsHeight; 使用double精度計算(我想;我不熟悉 C# 語義),將MaxY_Defect設置為 2,333,638.7551984754391014575958251953125。

float MaxY = (float)(MaxY_Defect); 將其轉換為float ,將MaxY設置為 2,333,638.75。

然后我們可以看到MinYMaxY具有相同的值,所以MaxY-MinY當然是零。

很簡單, float沒有足夠的精度來區分 2,333,638.6551984739489853382110595703125 和 2,333,638.7551984754391014575958251953125。 在 2,333,638 的刻度上, float格式中相鄰可表示數字之間的距離為.25。 這是因為格式有 24 位的有效位(浮點表示的小數部分)。 2,333,638 介於 2 21和 2 22之間,因此其浮點表示中的指數將有效數字縮放為具有表示從 2 21到 2 -2的值的位(從 21 到 -2,包括 24 個位置)。 因此,將有效位的最低位更改為 1 會將表示的數字更改為 2 -2 =.25。

因此,當 2,333,638.655... 和 2,333,638.755... 轉換為float時,它們具有相同的結果,即 2,333,638.75。

您不能使用float來區分在該量級上如此接近的坐標或大小。 您可以使用double或者您可以將坐標轉換為更接近原點(因此它們的大小更小,將它們放在float分辨率更好的區域中)。

只要最終結果很小,您就可以使用double進行中間計算,但仍然可以使用float很好地表示最終結果。

暫無
暫無

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

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