我正在为我的游戏开展响应式设计。我根据屏幕尺寸重新计算对象的位置。我正在做好的计算,但我的功能给了我错误的结果总是返回0。 我需要返回值为Int。
这里是代码:
public int rdnW(int a)
{
double b;
b = (a / 800 * 100);
return (int)(b * Widths / 100);
}
使用断点我看到b总是= 0;在我的情况下a = 258.谢谢
答案 0 :(得分:7)
您正在执行整数除法。将其中一个值转换为double
或float
,或将其中一个常量指定为double:即100.0而不是100。
实施例
b = (a / 800.0 * 100.0);
答案 1 :(得分:3)
使用
b = ((double)a / 800 * 100);
那是因为表达式被评估为integer
,因为所有因子都是整数。评估表达式后,它将保存到double
变量中。
你也可以使用类似的东西:
b = (a / 800.0 * 100);
或
b = (a / 800 * 100.0); //in your case this will return zero because (a/800) will be evaluated as integer
至少有一个因素是“告诉”编译器该表达式具有double
类型
答案 2 :(得分:2)
因为你所做的是整数除法。如果a
和b
是整数且a < b
,则a / b
总是会为您提供0
,无论您指定或投射它的类型。
在您的原因中,a
可能小于800
,因此这就是为什么它会给0
作出结果。
.NET有3种类型的划分。来自7.7.2 Division operator
来自整数分部部分;
该除法将结果舍入为零,且绝对值为 结果是最大可能的整数小于 两个操作数的商的绝对值。
分割两个整数时,结果始终为整数。对于 例如,7/3的结果是2.确定剩下的7 / 3,使用余数运算符(%)。 获得商数作为理性 数字或分数,给予被除数或除数类型float或type 双强>
作为解决方案,您可以将a
或800
喜欢;
b = ((double)a / 800 * 100);
或
b = (a / 800d * 100);
答案 3 :(得分:1)
您应该将a
转换为double,以便计算结果不会四舍五入。
b = ((double)a / 800 * 100);