首先,fmt.Sprintf("%.2f")使用的是banker rounding 而不是四舍五入,banker rounding 的定义如下(来自百度百科):
1.要求保留位数的后一位如果是4,则舍去。例如5.214保留两位小数为5.21。
2.如果保留位数的后一位如果是6,则进上去。例如5.216保留两位小数为5.22。
3.如果保留位数的后一位如果是5,而且5后面不再有数,要根据应看尾数“5”的前一位决定是舍去还是进入: 如果是奇数则进入,如果是
文章探讨了Golang中使用fmt.Sprintf(%.2f)格式化浮点数时,实际采用的并非标准的四舍五入,而是银行家舍入规则。然而,由于浮点数在二进制下的表示误差,某些情况下会出现看似不符合银行家舍入的行为。文章通过举例和分析源码解释了这一现象,并指出只有在浮点数能精确表示时,才会真正应用银行家舍入规则。
首先,fmt.Sprintf("%.2f")使用的是banker rounding 而不是四舍五入,banker rounding 的定义如下(来自百度百科):
1.要求保留位数的后一位如果是4,则舍去。例如5.214保留两位小数为5.21。
2.如果保留位数的后一位如果是6,则进上去。例如5.216保留两位小数为5.22。
3.如果保留位数的后一位如果是5,而且5后面不再有数,要根据应看尾数“5”的前一位决定是舍去还是进入: 如果是奇数则进入,如果是
8050