[英]Convert double to float goes wrong - C#
我需要計算rectangleF
類型的界限
由於某種原因,從double
到float
的轉換沒有按照應有的方式精確評估
這是這種計算的一個例子
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。
然后我們可以看到MinY
和MaxY
具有相同的值,所以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.