我想知道爲什麼我的下一條語句總是返回1,以及我如何修復它。我通過將分區中的第一個元素轉換爲浮點數來計算整數除法。除此之外,我沒有更進一步。將int轉換爲0-1 float
int value = any int;
float test = (float)value/int.MaxValue/2 + 1;
順便說我的意圖是讓這個任意整數轉換爲浮動0-1
我想知道爲什麼我的下一條語句總是返回1,以及我如何修復它。我通過將分區中的第一個元素轉換爲浮點數來計算整數除法。除此之外,我沒有更進一步。將int轉換爲0-1 float
int value = any int;
float test = (float)value/int.MaxValue/2 + 1;
順便說我的意圖是讓這個任意整數轉換爲浮動0-1
它並不總是返回零。例如,這樣的代碼:
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
避免隱式類型轉換。如果這是您想要的類型,請在您的double類型表達式中使用所有元素。在分部中使用它們之前,將int.MaxValue
和2
轉換爲double
,以便不涉及隱式類型轉換。
此外,你可能想要括號你的表達,使其更具可讀性。事實上,它很容易出錯。
最後,如果你的表情太複雜,你不知道發生了什麼,將它分成到更簡單的表達式,所有這些表達式都是double
。
P.S .:順便說一句,試圖獲得精確的結果,並使用float
而不是double
不是一個明智的做法。 使用float
進行精確浮點計算。
要在範圍內重新調整了一些s..e
到0..1
,你做(value-s)/(e-s)
。 所以在這種情況下:
double d = ((double)value - int.MinValue)/((double)int.MaxValue - int.MinValue);
float test = (float)d;
這將不會編譯 - 你是什麼初始化'價值'? –
不總是返回0. int value = int.MaxValue - > test == 1.5,int value = -int.MaxValue - > test == 0.5 –