.NET Core 3.1中ToString舍入行为变更的原因是什么?
差异原因解析
这个输出差异来自.NET Core 3.0及后续版本对浮点格式化逻辑的两项关键改进:
精确基于浮点实际存储值舍入
1.95无法用二进制浮点数(double类型)精确表示,实际存储的double值是一个略小于1.95的数值(约为1.949999999999999956)。
.NET Framework 4.7.2的格式化逻辑会先将浮点值转换为十进制字符串,此过程中可能把这个略小的数值近似显示为"1.95",之后对字符串舍入得到"2.0"。
而.NET Core 3.1采用了新算法,直接基于浮点值的二进制存储内容判断舍入方向,准确识别该值略小于1.95,因此保留一位小数时结果为"1.9"。生成最短唯一标识的十进制字符串
.NET Core 3.0之后的浮点格式化会生成能唯一对应原浮点值的最短十进制字符串,同时严格遵循舍入规则。旧版本的中间转换步骤容易引入精度误差,新算法彻底避免了这个问题,确保舍入结果匹配浮点值的真实数学大小。
内容的提问来源于stack exchange,提问作者innominate227
相关产品推荐
相关产品推荐

