为什么数学.四舍五入并不总是四舍五入双精度

本文关键字:四舍五入 双精度 为什么 | 更新日期: 2023-09-27 18:17:20

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(double)"answers"Math.Round(decimal)".

我就是不明白为什么前两个有用,而后两个不行。

为什么数学.四舍五入并不总是四舍五入双精度

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

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

您正在使用int值调用Math.Round。您可能想先将它们转换为double: Math.Round( 1.0 * freeThrows...) .

没有Math.Round(int)过载,但doubledecimal有过载,int可以隐式转换为两者。因此,调用将是二义性的。

尝试除整数-结果将是整数。所以这个数不能四舍五入。在除法和舍入之前将其转换为double:

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

在前两个示例中,您隐式地将参数转换为Math。四舍五入为双精度(即0.5和0.44)作为乘法因子。