2014-01-14 110 views
1

我想知道爲什麼我的下一條語句總是返回1,以及我如何修復它。我通過將分區中的第一個元素轉換爲浮點數來計算整數除法。除此之外,我沒有更進一步。將int轉換爲0-1 float

int value = any int; 
float test = (float)value/int.MaxValue/2 + 1; 

順便說我的意圖是讓這個任意整數轉換爲浮動0-1

+0

這將不會編譯 - 你是什麼初始化'價值'? –

+2

不總是返回0. int value = int.MaxValue - > test == 1.5,int value = -int.MaxValue - > test == 0.5 –

回答

3

它並不總是返回零。例如,這樣的代碼:

int value = 12345678; 
float test = (float)value/int.MaxValue/2 + 1; 
Console.WriteLine(test); 

打印1.002874

的問題是,浮標不是非常精確,因此對於value小的值,其結果將是0到漂浮的精度數字個數可以處理。

例如,value == 2300將打印0,但value == 2400將打印1.000001

如果使用double你得到更好的結果:

int value = 1; 
double test = (double)value/int.MaxValue/2 + 1; 
Console.WriteLine(test); 

打印1.00000000023283

+1

事實上,它幾乎從來沒有返回1.它只打印1爲小值 –

+0

現在好了,這是一些有用的信息。如果有人告訴我這是關於精度,我會馬上得到它=) – Villermen

+0

我想我只是改變輸入類型的東西不那麼大。 – Villermen

0

避免隱式類型轉換。如果這是您想要的類型,請在您的double類型表達式中使用所有元素。在分部中使用它們之前,將int.MaxValue2轉換爲double,以便不涉及隱式類型轉換。

此外,你可能想要括號你的表達,使其更具可讀性。事實上,它很容易出錯。

最後,如果你的表情太複雜,你不知道發生了什麼,將它分成到更簡單的表達式,所有這些表達式都是double

P.S .:順便說一句,試圖獲得精確的結果,並使用float而不是double不是一個明智的做法。 使用float進行精確浮點計算。

+0

double test1 =(double)inputint /(double)int.MaxValue; double test2 = test1/2d; float result =(float)(test2/1d); 這仍然每次產生1。 – Villermen

+1

@Villermen然後看看每一步,找出_exact_,這個計算結果與您的期望不同的孤立的地方。 –

+0

我做到了。它給出了分數結果,直到我加起來爲止。然後整個答案突然變成@ – Villermen

2

要在範圍內重新調整了一些s..e0..1,你做(value-s)/(e-s)。 所以在這種情況下:

double d = ((double)value - int.MinValue)/((double)int.MaxValue - int.MinValue); 
float test = (float)d;