3

作業中のコードで問題を解決しましたが、これは私を悩ませているものです。

特定の状況での浮動小数点は、丸めを台無しにするだけであることを知っています。PHP が型推論を使用していることは知っています。また、文字列間で論理的に操作すると自動キャストが行われます (つまり、この特定のケースでは、私の例では)。

同じことを「コードで手作業で」行うと、160.2 * 50 の結果は 8010 になります。整数の結果にキャストするときに丸めを行う必要はありません。ただ悪いです。なぜこれが起こるのか誰かが知っていれば、それは私を啓発するでしょう.

echo "160.2" * "50"; // gives 8010
echo (int) ((float)"160.2" * (int)"50"); // Gives 8009

問題を解決し、コードが機能するようになりました。これはただの楽しみです。理由と方法を知りたいのですが、段階的にphpがこれを台無しにします。PHPが解像度を失っているのはどこですか? どの段階で?

前もって感謝します :)

4

2 に答える 2

3

PHPは、内部的(float)"160.2"に同等のバイナリとして表されます。160.19999999995343387126...これにより、乗算の結果が8010よりもわずかに小さくなり、intにキャストバックすると、切り捨てが発生し、8009になります。

バイナリの160.2は完全に表現できません。循環小数になりますが、

10100000.00110011001100110011001100110011...

したがって、floatで正確に表現されることは期待できません。

コンバーター

于 2012-10-27T21:00:18.377 に答える
1

PHPはどこで解像度を失っていますか?どのステップで?

結果をintにキャストするとき。元々、結果はfloatになりますが、php設定の精度を上げると、次のようになります。intに8009.9999999999990905052982270718正の数をキャストすることは、基本的にを呼び出すことと同じです。floor()そのため、出力され8009ます。

于 2012-10-27T20:59:15.557 に答える