为什么数学.四舍五入并不总是四舍五入双精度
本文关键字:四舍五入 双精度 为什么 | 更新日期: 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 ORB
和double FT
。
由于某些原因,我不能对它们使用Math.Round
。它说:
调用在以下方法或属性之间是二义性的:"Math.Round(double)"answers"Math.Round(decimal)".
我就是不明白为什么前两个有用,而后两个不行。
在前两个调用中,都添加了一些内容。0.5
和0.44
都将值转换为双精度,因为0.5
和0.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)
过载,但double
和decimal
有过载,int
可以隐式转换为两者。因此,调用将是二义性的。
尝试除整数-结果将是整数。所以这个数不能四舍五入。在除法和舍入之前将其转换为double:
double ORB = Math.Round( (double)offensiveRebounds / (offensiveRebounds + opponentDefensiveRebounds) );
double FT = Math.Round( (double)freeThrows / fieldGoalAttempts );
在前两个示例中,您隐式地将参数转换为Math。四舍五入为双精度(即0.5和0.44)作为乘法因子。