我想知道为什么我的下一个语句总是返回1,以及我如何解决它。我通过将分区中的第一个元素转换为float来计算整数除法。除此之外,我没有进一步深入。
int value = any int;
float test = (float)value / int.MaxValue / 2 + 1;
顺便说一句,我的意图是将这个转换为0-1浮点数
答案 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..e
到0..1
范围内的数字,请执行(value-s)/(e-s)
。
所以在这种情况下:
double d = ((double)value - int.MinValue) / ((double)int.MaxValue - int.MinValue);
float test = (float)d;
答案 2 :(得分:0)
避免隐式类型转换。如果这是您想要的类型,请使用double类型表达式中的所有元素。将int.MaxValue
和2
转换为double
,然后在分区中使用它们,这样就不会涉及隐式类型转换。
此外,您可能希望括号表达式,以使其更具可读性。事实上,这很容易出错。
最后,如果您的表达过于复杂而且您不知道发生了什么,将其拆分为更简单的表达式,所有这些表达式都为double
。
P.S。:顺便说一下,尝试获得精确结果并使用float
代替double
并不是一件非常明智的事情。 使用float
进行精确的浮点计算。