C#计算日期间隔天数时Math.Round保留2位小数失效问题
C# 日期间隔计算输出长小数、Math.Round不生效问题解决
问题背景
我是编程及C#开发初学者,编写了一段用于计算当前日期与指定未来日期间隔天数的代码,代码基础功能可正常运行,但输出的剩余天数为115.11560043243519这类多位长小数,我希望将结果四舍五入保留2位小数以优化输出格式,调用Math.Round(remainingDays, 2)处理后未达到预期效果,原始代码如下:
Console.WriteLine("Newport to Owensboro:"); var currentDate = DateTime.Now; var endDate = new DateTime(2022, 10, 30); double remainingDays = endDate.Subtract(currentDate).TotalDays; Console.WriteLine("Days until completion: {0}\n", remainingDays); Math.Round(remainingDays, 2);
失效原因
Math.Round()属于计算类方法,执行后会返回四舍五入完成的新值,不会直接修改你传入的原始remainingDays变量,你没有接收、使用这个返回值,等于白调用了这个方法。- 你的代码是先输出原始的
remainingDays值,之后才执行四舍五入逻辑,执行顺序错误,输出环节根本没用到处理后的结果。
修复方法
选任意一种即可实现保留2位小数的需求:
方法1:接收Math.Round返回值后再输出
把四舍五入逻辑移到输出语句前,用变量接住处理后的结果再打印:
Console.WriteLine("Newport to Owensboro:"); var currentDate = DateTime.Now; var endDate = new DateTime(2022, 10, 30); double remainingDays = endDate.Subtract(currentDate).TotalDays; // 接收四舍五入后的结果 double roundedResult = Math.Round(remainingDays, 2); Console.WriteLine("Days until completion: {0}\n", roundedResult);
方法2:输出时直接指定格式化规则
不需要额外调用Math.Round,直接在字符串格式化阶段指定保留2位小数,写法更简洁:
Console.WriteLine("Newport to Owensboro:"); var currentDate = DateTime.Now; var endDate = new DateTime(2022, 10, 30); double remainingDays = endDate.Subtract(currentDate).TotalDays; // {0:F2}表示对应第0个参数,格式化为固定2位小数 Console.WriteLine("Days until completion: {0:F2}\n", remainingDays);
补充提示:C#中double、int这类值类型传入方法时传递的是值的拷贝,方法内部的处理不会影响原始变量的值,后续遇到同类计算方法,都需要通过接收返回值的方式拿到处理后的结果。
内容的提问来源于stack exchange,提问作者M.DeMar
相关产品推荐
相关产品推荐

