不能做一个简单的划分

时间:2013-12-12 13:38:54

标签: c# function xna division

我正在为我的游戏开展响应式设计。我根据屏幕尺寸重新计算对象的位置。我正在做好的计算,但我的功能给了我错误的结果总是返回0。 我需要返回值为Int。

这里是代码:

public int rdnW(int a)
{
    double b;

    b = (a / 800 * 100);
    return (int)(b * Widths / 100);
}

使用断点我看到b总是= 0;在我的情况下a = 258.谢谢

4 个答案:

答案 0 :(得分:7)

您正在执行整数除法。将其中一个值转换为doublefloat,或将其中一个常量指定为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)

因为你所做的是整数除法。如果ab是整数且a < b,则a / b总是会为您提供0,无论您指定或投射它的类型。

在您的原因中,a可能小于800,因此这就是为什么它会给0作出结果。

.NET有3种类型的划分。来自7.7.2 Division operator

  • 整数分部
  • 浮点划分
  • 十进制分割

来自整数分部部分;

  

该除法将结果舍入为零,且绝对值为   结果是最大可能的整数小于   两个操作数的商的绝对值。

来自/ Operator (C# Reference)

  

分割两个整数时,结果始终为整数。对于   例如,7/3的结果是2.确定剩下的7 /   3,使用余数运算符(%)。 获得商数作为理性   数字或分数,给予被除数或除数类型float或type   双

作为解决方案,您可以将a800喜欢;

加倍
b = ((double)a / 800 * 100);

b = (a / 800d * 100);

答案 3 :(得分:1)

您应该将a转换为double,以便计算结果不会四舍五入。

b = ((double)a / 800 * 100);