PHP sprintf('%d',floatval('16 .40')* 100)输出1639?

时间:2017-06-08 09:22:50

标签: php printf

下面的sprinf行为非常奇怪。

// The code below outputs 1639
$value = floatval('16.40') * 100;
echo sprintf('%d', $value); 

但是当我使用%f时,它会输出1640.000000

我抛弃了$value,绝对是float(1640)

有人知道我使用%d时发生了什么吗?这是一个PHP错误吗?我已经在PHP7中测试过了。

1 个答案:

答案 0 :(得分:3)

变量$value包含浮点数。浮点数不精确,它们是近似值。 1

$value的值不是1640,而是1639.99999999999977262632。当您使用%f进行打印时,printf()将其舍入到6小数位,舍入值为1640.000000

使用%d打印时,printf()仅使用$value的整数部分,且为1639

使用round()获取正确的整数值:

printf('%d', round($value, 0));

或者,更好的是,使用number_format()将值作为字符串获取:

echo(number_format($value, 0, '', ''));

两者都打印1640

1 想想1/3。它近似为0.3333333333,但无法准确表示它,因为它在小数点后面有无限数量的3。在数学中,3 * 1/3 = 1但在现实生活中(以及在计算机中),3 * 0.333333333永远不会1,无论我们在小数点后面放多少3。计算机程序通常将值四舍五入到一些小数位,最终显示为1,但这并不总是发生。

当它没有发生时,StackOverflow上会弹出另一个question similar to this one