sprintf四舍五入

时间:2017-07-06 08:19:40

标签: php

为什么以下产生不同的结果?

echo 2.55 * 100;
echo sprintf(' %d', 2.55 * 100);

输出:

255 254

1 个答案:

答案 0 :(得分:3)

因为基数2固定大小表示中的2.55 * 100不是整数而%d不是圆的:

var_dump(sprintf('%d', 1.99));
string(1) "1"
ini_set('precision', 20);
var_dump(2.55 * 100);
float(254.99999999999997158)

printf()不同,echo $numeric_variable没有专门的机制来从字符串转换为数字。它仅使用default rules转换为字符串,因此它与(string)$numeric_variablestrval($numeric_variable)相同。在这种情况下:

  • 由于变量类型为float,它会尝试表示浮点数(这意味着从二进制IEEE 754转换为十进制)。
  • 它读取precision指令以微调表示:

      

    浮点数中显示的有效位数。 -1表示将使用用于舍入此类数字的增强算法。

要将IEEE 754中的错误减少为十进制转换,请根据需要进行字符串转换。在我的计算机中,默认precision14,这与9的数量非常接近。