2

sprintfPHPがいくつかの数字を変更しているように見えるという奇妙な問題があります。これは常に発生するわけではなく、たまに発生します。

次のコード:

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.99999999999984368059813278E1int is にキャストされ1998ます。

「19.99 はそれらの数字の 1 つにすぎません...」 (@ Dragons Linkを参照) 正確な結果については、bcmath 拡張機能を使用します。

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