.NET Core中Decimal转Double与.NET 4.7.2结果不一致问题咨询
decimal转double在.NET Framework与.NET Core中结果差异的原因
这个差异源于两点:double类型的精度限制,以及两个框架在decimal转double时的实现逻辑不同。
- double的精度本质限制:double是64位IEEE 754浮点数,仅能精确表示二进制分数的组合。10500000000这个十进制数无法被double精确存储,因为它的二进制展开是无限循环的,转换时必须舍入到最近的可表示double值。
- 框架转换实现的更新:
- .NET Framework 4.7.2采用的旧转换算法,在处理这类数值时,最终舍入到了直观的十进制整数值
10500000000,但这并非严格符合IEEE 754标准的结果。 - .NET Core(及后续.NET 5+)更新了转换逻辑,严格遵循IEEE 754的“最近舍入,偶数优先”规则,得到了真正最接近原decimal值的double表示——
10499999999.999998(实际精确值为10499999999.999998181010596454143524169921875,格式化输出后显示为前者)。
- .NET Framework 4.7.2采用的旧转换算法,在处理这类数值时,最终舍入到了直观的十进制整数值
简单来说,.NET Core的结果才是更符合浮点数标准的精确转换结果,而.NET Framework的旧实现做了偏向直观的近似处理。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

