ini_set('precision', 32);
var_dump(0.855);
//float(0.84999999999999997779553950749687)
var_dump(round(0.855, 2, PHP_ROUND_HALF_EVEN));
//float(0.85999999999999998667732370449812)
var_dump((float)sprintf('%.2f', 0.855));
//float(0.84999999999999997779553950749687)
为什么sprinf()和round()的结果有区别?
据我所知,0.855不能表示为IEEE754中的确切数字,这不是关于为什么会出现这种情况的问题。
This answer表示C like函数应用“round to nearest and ties to even”,这是我期望PHP_ROUND_HALF_EVEN标志应该复制的。
修改: 我不想打[复制]关闭,所以如果有人在将来发现并感兴趣,链接问题中最接近的答案是https://stackoverflow.com/a/27108849/820841,其中round()被写为“做正确的事” 。我想现在必须满足我的好奇心。