.NET中System.Math.Round长时间运行后返回错误值问题求助
.NET 4.8中System.Math.Round长时间运行后返回错误结果的问题
问题现象
- 系统运行数小时后生成错误值,经调试定位为
System.Math.Round返回错误结果 - 同一机器上两个配置完全一致的Visual Studio实例,运行同一项目、同一代码、同一堆栈位置,仅持续运行数小时的实例出现故障
- 在即时窗口执行相同常量表达式,正常实例与故障实例返回结果不同;实际业务代码中
Math.Round同样返回错误值 - 使用的.NET版本信息:
System.Environment.Version→4.0.30319.42000(typeof(string).Assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false))[0]→4.8.4644.0
已知Bug情况
这是.NET Framework 4.8中与JIT编译相关的罕见Bug,当进程长时间运行后,JIT编译器对Math.Round的优化逻辑会出现异常,导致计算结果偏差。该Bug在官方反馈渠道有相关记录,触发条件通常是进程持续运行数小时且存在大量数值计算场景。
规避方案
- 自定义安全的Round实现:通过Decimal类型中转实现Round逻辑,绕过系统
Math.Round的JIT优化问题,示例代码:public static double SafeRound(double value, int decimalPlaces) { return (double)Math.Round((decimal)value, decimalPlaces); } - 临时重启进程:应急场景下,发现异常后重启应用进程,重置JIT编译状态
- 升级.NET Framework版本:将.NET Framework升级至4.8.1及以上累积更新版本,微软在后续更新中修复了此类JIT相关的数值计算异常
- 启用Legacy JIT:在应用配置文件中添加配置,禁用新JIT编译器的优化,避免触发异常:
<runtime> <useLegacyJit enabled="true"/> </runtime>
内容的提问来源于stack exchange,提问作者Mud
相关产品推荐
相关产品推荐

