[PHP-users 34456] Re: ceil関数について

Shu Sawada luna @ lunanet.gr.jp
2009年 3月 23日 (月) 14:51:30 JST


さわだ@札幌、です。

> $a = 1500 * 0.67;
> var_dump($a);
> 
> $b = ceil($a);
> var_dump($b);
> 上記のスクリプトを実行しますと下記のような結果が返ってきます。
> float(1005)
> float(1006)

内部表現の問題じゃないすかね。

[luna @ neumann ~]$ cat math.php
#!/usr/bin/php
<?php
$a = 1500 * 0.67;
var_dump($a);
printf("%.15f", $a);print "\n";
$b = ceil($a);
var_dump($b);
printf("%.15f", $b);print "\n";
?>

[luna @ neumann ~]$ ./math.php
float(1005)
1005.000000000000114
float(1006)
1006.000000000000000
[luna @ neumann ~]$

also see:
http://php.net/manual/ja/language.types.float.php

> 警告
> 浮動小数点数の精度
> 
> 0.1 や 0.7 のようなシンプルな小数であっても、 それを内部的な二進数表現に変換する際には、どうしても多少精度が落ちて
> しまいます。 その結果、不思議な結果を引き起こすことがあります。
> たとえば、 floor((0.1+0.7)*10) の結果はたいてい 7 となるでしょう。おそらくは 8 を想定して
> いらっしゃるでしょうが、そのようにはなりません。 これは、(この計算結果の) 内部的な値が 7.9999999999... の
> ようになっているからです。

-- 
 Shu Sawada
 http://luna.lunanet.gr.jp/


PHP-users メーリングリストの案内