为何C#中Math.Round(6.665d,2)得6.66,而Math.Round(66.665d,2)得66.67?
为什么Math.Round的结果会有差异?
核心原因是double类型的二进制浮点数无法精确表示部分十进制小数,6.665d和66.665d在内存中的实际存储值和你写的字面量有细微偏差,这直接导致了四舍五入的结果不同:
- 对于
6.665d:它实际存储的值是略小于6.665的(比如约6.664999999999999),当用Math.Round保留两位小数时,这个值会被舍入为6.66。 - 对于
66.665d:它实际存储的值是略大于66.665的(比如约66.66500000000001),同样保留两位小数时,会被进一位得到66.67。
顺带提一句,Math.Round默认采用的是「银行家舍入法」(四舍六入五成双),但这里的结果差异本质不是舍入规则导致的,而是原始浮点数的精度误差。你可以通过输出更多小数位来验证这个偏差:
Console.WriteLine(6.665d.ToString("F15")); // 输出:6.664999999999999 Console.WriteLine(66.665d.ToString("F15")); // 输出:66.665000000000010
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

