2012-07-10 29 views
2

我有一個奇怪的問題,其中PHP的sprintf似乎在改變一些數字。這不會一直髮生,只是偶爾發生。php sprintf顯示錯誤的號碼

下面的代碼:

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

產生了$ 19.99的產品輸出如下:1998(1999)

我可以解決這個問題,但我很想知道爲什麼它是幹什麼的,如果有明顯的瘋狂的任何方法。

更新: 它看起來像是從float轉換爲int時發生的。下面給出了相同的輸出:

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

什麼每個程序員應該知道關於浮點運算:HTTP:// floating-point-gui.de/ – 2012-07-10 22:29:04

回答

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

什麼數字格式,你找什麼?

0

首先:%d有點像(int)劇組。

19.99 = 1.99899999999999984368059813278E1 = 0x4033FD70A3D70A3D 

in IEEE 64 Bit。

如果我們將浮點數乘以100得到1998.99999999999984368059813278E1鑄造成int是1998

「19.99僅僅是這些數字的一個......」(見@Dragons Link) 的精確結果使用bcmath時擴展:

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