[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 メーリングリストの案内