[PHP-users 6018] Re: 0.6/0.2の結果

Koji KUSANAGI php-users@php.gr.jp
Fri, 08 Mar 2002 17:46:40 +0900


草薙と申します。

http://jp.php.net/manual/ja/language.types.float.php#warn.float-precision

にあるように、0.6/0.2の演算結果の$hogeは、float型の0.6、0.2各々の内部表現(2
進)への変換誤差の結果として2.999999999…となっています。

echoで表示された3はfloat型の$hogeの末桁が丸められた表示だと思われます。

ところが、float型からintegerへの明示的な型キャストではその数は*ゼロの方に*
丸められます。すなわち、2.99999999…は2となる

http://jp.php.net/manual/ja/language.types.integer.php#language.types.integer.casting

ソースを見たわけではないので未検証ですが、この挙動の差によって起こる現象では
ないかと思います。

# マニュアルでも未知の端数の型キャストは予期せぬ結果を招くと書いてあります。

誤差を避けるためには、任意精度数学関数を使われてはどうでしょうか。


--Original Message--
From: Kohji Tsujita
>辻田@マルジュです。
>
>少し気になることがあります。
>以下のコードを見て下さい。
>
><?php
>$hoge=0.6/0.2;
>
>echo $hoge;
>echo "<br>";
>echo (int)$hoge;
>?>
>
>普通に考えると
>3
>3
>と返るはずですが、このコードを実行してみると
>3
>2
>と返って来ます。
>確かに(int)のキャストは意味がないですが、
>ここは3と返ってしかるべきだと思います。
>
>これはPHPのバグなのでしょうか?
>
>
>ちなみに環境は
>FreeBSD 4.5
>PHP-4.1.2
>ですが、
>その他の環境でも試しても同じ結果になったので
>環境はあまり関係ないと思われます。
>
>
>
>
>_______________________________________________
>PHP-users mailing list
>PHP-users@php.gr.jp
>http://ns1.php.gr.jp/mailman/listinfo/php-users

----------------------------------------------------
草薙考司 <kusanagi@crumple.co.jp>