下面的sprinf行为非常奇怪。
// The code below outputs 1639
$value = floatval('16.40') * 100;
echo sprintf('%d', $value);
但是当我使用%f
时,它会输出1640.000000
我抛弃了$value
,绝对是float(1640)
。
有人知道我使用%d
时发生了什么吗?这是一个PHP错误吗?我已经在PHP7中测试过了。
答案 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。