http://www.xhldev.com/news/44-cn.html
在php中sprintf经常被用来格式字符串,当sprintf用%.*f格式化时经常被认为是“四舍五入”,但实事上这个“四舍五入”并不是数学上的“四舍五入”,而是“四舍六入五成双”,英文中被称为”round half to even”或”Banker’s rounding”,如下面的这个地址:
http://stackoverflow.com/questions/10357192/printf-rounding-behavior-for-doubles/10357252#10357252
“四舍六入五成双”是指,当保留精度的下一位不是5时,按正常的四舍五入;当保留精度的下一位是5时,5的前一位是奇数,则进位,是偶数,则舍弃;而如果5的后面还有大于0的部分时,则无论5的前一位是奇数还是偶数,都进行进位。更完整的说明请见: http://blogs.msdn.com/b/ericlippert/archive/2003/09/26/bankers-rounding.aspx
1.当保留精度的下一位不是5时,按正常的四舍五入;
$str = 12.464; echo sprintf('%.2f', $str); //out 12.46
2.当保留精度的下一位是5时,5的前一位是奇数,则进位,是偶数,则舍弃;
前一位是偶数: $str = 12.465; echo sprintf('%.2f', $str) //out 12.46 前一位是奇数: $str = 12.455; echo sprintf('%.2f', $str) //out 12.46
3.而如果5的后面还有大于0的部分时,则无论5的前一位是奇数还是偶数,都进行进位
$str = 12.4651; echo sprintf('%.2f', $str) //out 12.47