You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:17:09