> [2012-04-11 07:47 UTC] foobla at spambog dot com > I don't think it's about PHP_MAX_INT, rather about the maximum precision of a double/float. "==" converts both strings to numbers (after spending CPU cycles to detect whether they look like numbers), as described in http://www.phpsadness.com/sad/47 [phpsadness.com] > > once converted, the floats seem to actually *be* equal, even with "===": > > php -r ' > $a = (double)"9223372036854775807"; > $b = (double)"9223372036854775808"; > var_dump($a, $b, $a == $b, $a === $b); > ' > float(9.2233720368548E+18) > float(9.2233720368548E+18) > bool(true) > bool(true)
===を使えば良いだけのような (スコア:0)
その辺が問題になるようなプログラムなら===を使っているだろうし実害はない気がする。
Re:===を使えば良いだけのような (スコア:1)
> [2012-04-11 07:47 UTC] foobla at spambog dot com
> I don't think it's about PHP_MAX_INT, rather about the maximum precision of a double/float. "==" converts both strings to numbers (after spending CPU cycles to detect whether they look like numbers), as described in http://www.phpsadness.com/sad/47 [phpsadness.com]
>
> once converted, the floats seem to actually *be* equal, even with "===":
>
> php -r '
> $a = (double)"9223372036854775807";
> $b = (double)"9223372036854775808";
> var_dump($a, $b, $a == $b, $a === $b);
> '
> float(9.2233720368548E+18)
> float(9.2233720368548E+18)
> bool(true)
> bool(true)
ということで、実害ありそうな。
なお、perl でやってみたところ、
$a == $b は true、$a eq $b は(当然)false でした。
問題の本質は、== を文字比較に使用しているところでしょう。
Re:===を使えば良いだけのような (スコア:1)
doubleにキャストしてしまってる時点でダメなんじゃないの?
その後どうしようがキャストした時点で値が違うんだから、==による暗黙の型変換なんか意味がない。
ちなみにうちではこうなった。
$ php -v
PHP 5.4.24 (cli) (built: Jan 19 2014 21:32:15)
$ php -r '
> $a = "9223372036854775807";
> $b = "9223372036854775808";
> var_dump($a, $b, $a == $b, $a === $b);
> '
string(19) "9223372036854775807"
string(19) "9223372036854775808"
bool(false)
bool(false)
$php -r "var_dump('9223372036854775807'=='9223372036854775808');"
bool(false)
$ php -r "var_dump('9999999999999999999.0' == '9999999999999999999.1');"
bool(true)
$ php -r '
> $a = "9999999999999999999.0";
> $b = "9999999999999999999.1";
> var_dump($a == $b, $a === $b);
> '
bool(true)
bool(false)
Re:===を使えば良いだけのような (スコア:1)
ええ。
内部的にdoubleにキャストしているため
== と === で変化がない、という意味です。