为什么Math.Round并不总是四舍五入

时间:2015-10-11 14:05:59

标签: c# math double decimal

int fieldGoals =                int.Parse(Console.ReadLine());
int fieldGoalAttempts =         int.Parse(Console.ReadLine());
int threePointFieldGoals =      int.Parse(Console.ReadLine());
int turnovers =                 int.Parse(Console.ReadLine());
int offensiveRebounds =         int.Parse(Console.ReadLine());
int opponentDefensiveRebounds = int.Parse(Console.ReadLine());
int freeThrows =                int.Parse(Console.ReadLine());
int freeThrowAttempts =         int.Parse(Console.ReadLine());

double eFG = Math.Round( (fieldGoals + 0.5 * threePointFieldGoals) / fieldGoalAttempts );
double TOV = Math.Round( turnovers / (fieldGoalAttempts + 0.44 * freeThrowAttempts + turnovers) );
double ORB = Math.Round( offensiveRebounds / (offensiveRebounds + opponentDefensiveRebounds) );
double FT  = Math.Round( freeThrows / fieldGoalAttempts );

问题在于double ORBdouble FT

出于某种原因,我无法使用Math.Round。它说:

  

以下方法或属性之间的调用不明确:   " Math.Round(双)"和" Math.Round(十进制)"。

我只是不知道为什么前两个工作,但后两个不工作。

4 个答案:

答案 0 :(得分:4)

在前两次调用中,您向两者添加了一些内容。 0.50.44都将值转换为双精度值,因为0.50.44都被视为双精度数。但是当你使用后两个时,它们都只使用整数,既不是双精度也不是十进制,并且可以转换为其中任何一个。要解决此问题,您只需执行Math.Round( (double) (*calculations*) );

即可

或者,实际上更好的方法是将值的一个转换为double - 这样,它将以double计算除法。
(double)offensiveRebounds / (offensiveRebounds + opponentDefensiveRebounds)
(double)freeThrows / fieldGoalAttempts

答案 1 :(得分:2)

您正在使用Math.Round值来调用int。您可能希望先将它们转换为doubleMath.Round( 1.0 * freeThrows...)

没有Math.Round(int) overloaod,但doubledecimalint的重载可以轻微转换为两者。因此,电话会很模糊。

答案 2 :(得分:1)

您尝试分配整数 - 结果将是整数。所以,你不能围绕这个数字。在分割和舍入之前将其转换为双倍:

double ORB = Math.Round( (double)offensiveRebounds / (offensiveRebounds + opponentDefensiveRebounds) );
double FT  = Math.Round( (double)freeThrows / fieldGoalAttempts );

答案 3 :(得分:0)

在前两个中,您隐式将参数转换为Math.Round为double,其中double(即0.5和0.44)用作倍增因子。

在第二个中,你还没有。