[PHP-users 24526] 浮動小数点数の精度について
大和田 健一
linux @ ohwada.net
2005年 2月 14日 (月) 17:36:31 JST
浮動小数点数は、精度の問題があることは、承知しています。
http://php.s3.to/man/language.types.float.html
(1)のテストコードは (2)の結果になります。
PHPのバージョンによらずに、同じ結果になりますか?
意外な結果だったもので、
ひょっとして、私の環境だけだろうかと、思ったりしています。
環境は
Linux Debian woody
PHP 4.1.2-7.0.1
2.05 は、この数値でおかしくなることに気づいたので、例に挙げています。
2.04999999 という風には表示されないのでしょうか?
(1) テストコード
-----
<?php
// NG
$float1 = 100 * 2.05;
var_dump($float1);
echo "<br>";
$int1 = intval($float1);
var_dump($int1);
echo "<br>";
$int2 = (int)$float1;
var_dump($int2);
echo "<br><br>";
// NG
for($float=2.0; $float<2.1; $float+=0.01)
{
$float1 = 100 * $float;
$int1 = intval($float1);
echo "$float -> $float1 -> $int1 <br>";
}
echo "<br>";
// OK
for($float=2.0; $float<2.1; $float+=0.01)
{
$float1 = 100 * ($float + 0.001);
$int1 = intval($float1);
echo "$float -> $float1 -> $int1 <br>";
}
?>
-----
(2) 結果
-----
float(205)
int(204)
int(204)
2 -> 200 -> 200
2.01 -> 201 -> 200
2.02 -> 202 -> 201
2.03 -> 203 -> 202
2.04 -> 204 -> 203
2.05 -> 205 -> 204
2.06 -> 206 -> 205
2.07 -> 207 -> 206
2.08 -> 208 -> 207
2.09 -> 209 -> 208
2.1 -> 210 -> 209
2 -> 200.1 -> 200
2.01 -> 201.1 -> 201
2.02 -> 202.1 -> 202
2.03 -> 203.1 -> 203
2.04 -> 204.1 -> 204
2.05 -> 205.1 -> 205
2.06 -> 206.1 -> 206
2.07 -> 207.1 -> 207
2.08 -> 208.1 -> 208
2.09 -> 209.1 -> 209
2.1 -> 210.1 -> 210
-----
--
大和田 健一 <linux @ ohwada.net>
PHP-users メーリングリストの案内