C#中Math.Truncate使用不当,需将26.8截断为26的问题
登山纪录判断程序的时间取整问题解决
你的需求很明确:开发控制台程序判断登山者是否打破纪录,每攀登50米损失30秒,计算损失时间wastedTime时需要向下取整(比如26.5秒取26秒,而非27秒)。
当前代码的正确性
你用Math.Truncate((range / 50) * 30)计算损失时间的方式完全正确。Math.Truncate()会直接截断浮点数的小数部分,对于正数场景来说,这和向下取整的效果完全一致,刚好满足你把26.5取为26的需求。
可选替代方案
如果想更明确表达“向下取整”的语义,也可以用Math.Floor()方法,在正数场景下它和Math.Truncate()结果完全相同:
double wastedTime = Math.Floor((range / 50) * 30);
代码优化建议(可选)
你的代码逻辑没问题,做几个小调整能让可读性更好:
- 变量命名更直观,比如把
range改成climbDistance,timeForOneMeter改成timePerMeter - 简化分支判断,
else if (georgesTime>record)可以直接写成else,因为只有两种情况
优化后的代码示例:
class Program { static void Main(string[] args) { double record = double.Parse(Console.ReadLine()); double climbDistance = double.Parse(Console.ReadLine()); double timePerMeter = double.Parse(Console.ReadLine()); double baseTime = timePerMeter * climbDistance; double wastedTime = Math.Truncate((climbDistance / 50) * 30); double totalTime = baseTime + wastedTime; if (totalTime <= record) { Console.WriteLine($"Yes! The new record is {totalTime:F2} seconds."); } else { Console.WriteLine($"No! He was {totalTime - record:F2} seconds slower."); } } }
测试验证
比如当攀登距离为44.1667米时,(44.1667 / 50) * 30 = 26.5,经过Math.Truncate()处理后wastedTime的值为26,完全符合你的要求。
内容的提问来源于stack exchange,提问作者KristiyanArnaudov
相关产品推荐
相关产品推荐

