PHP sprintf 显示错误的数字


php sprintf displaying wrong number

我遇到了一个奇怪的问题,PHP的sprintf似乎正在改变一些数字。这种情况不会一直发生,只是偶尔发生。

以下代码:

echo sprintf('%04d',$product['priceUSD']*100)."(".($product['priceUSD']*100).")";

为 $19.99 的产品生成以下输出:1998(1999)

我可以解决这个问题,但我想知道它为什么要这样做,以及是否有任何方法可以解决明显的疯狂。

更新:看起来它发生在从浮点数转换为 int 时。 下面给出了相同的输出:

echo (int)($product['priceUSD']*100)."(".($product['priceUSD']*100).")";
 echo sprintf('%.2f',$product['priceUSD']*100)."(".sprintf('%.2f',$product['priceUSD']*100).")";

您在寻找什么数字格式?

首先:%d有点像(int)演员。

19.99 = 1.99899999999999984368059813278E1 = 0x4033FD70A3D70A3D 

在 IEEE 64 位中。

如果我们将其浮点数乘以 100,我们会得到1998.99999999999984368059813278E1转换为 int 是 1998 .

"19.99只是其中一个数字......"(见@Dragons链接(要获得确切的结果,请使用 BCMATH 扩展:

echo sprintf('%4d', bcmul ($price,100));

要在面临浮点运算问题时稳定乘法,请利用bcmul()函数将两个数字相乘。

其次,我应该提到,printf()将进行四舍五入,但(int)不会。

代码:(演示(

$product['priceUSD'] = '19.99';
printf('%04d', bcmul($product['priceUSD'], 100));

输出:

1999