将int转换为0-1 float

时间:2014-01-14 08:37:08

标签: c# math

我想知道为什么我的下一个语句总是返回1,以及我如何解决它。我通过将分区中的第一个元素转换为float来计算整数除法。除此之外,我没有进一步深入。

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

顺便说一句,我的意图是将这个转换为0-1浮点数

3 个答案:

答案 0 :(得分: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 :(得分:2)

要重新调整s..e0..1范围内的数字,请执行(value-s)/(e-s)。 所以在这种情况下:

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

答案 2 :(得分:0)

避免隐式类型转换。如果这是您想要的类型,请使用double类型表达式中的所有元素。将int.MaxValue2转换为double,然后在分区中使用它们,这样就不会涉及隐式类型转换。

此外,您可能希望括号表达式,以使其更具可读性。事实上,这很容易出错。

最后,如果您的表达过于复杂而且您不知道发生了什么,将其拆分为更简单的表达式,所有这些表达式都为double

P.S。:顺便说一下,尝试获得精确结果并使用float代替double并不是一件非常明智的事情。 使用float进行精确的浮点计算。