2

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

以下代码:

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

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

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

更新:从 float 转换为 int 时似乎正在发生这种情况。以下给出相同的输出:

echo (int)($product['priceUSD']*100)."(".($product['priceUSD']*100).")";
4

2 回答 2

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

你在找什么数字格式?

于 2012-07-10T22:39:37.547 回答
0

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

19.99 = 1.99899999999999984368059813278E1 = 0x4033FD70A3D70A3D 

在 IEEE 64 位。

如果我们将浮点数乘以 100,我们将被1998.99999999999984368059813278E1强制转换为 int is 1998

“19.99 只是这些数字之一......”(请参阅​​@Dragons Link)使用 bcmath 扩展获得确切结果:

echo sprintf('%4d', bcmul ($price,100));
于 2012-07-10T23:25:41.137 回答