算術演算子は四則演算をはじめとして、加算減算や数学的な演算を行います。
四則演算
私たちが普段から計算でよく使う演算です。
記号 | 役割 |
+ | 加算(足し算) |
– | 減算(引き算) |
* | 乗算(掛け算) |
/ | 除算(割り算) |
% | 余剰(余り) |
** | 累乗(同じ数の掛け算) |
※ **は5.6以上で登場。それまではpow()関数を使用。
echo 100+1 . PHP_EOL; //足し算 101
echo 100-1 . PHP_EOL; //引き算 99
echo 100*100 . PHP_EOL; //掛け算 10000
echo 9/3 . PHP_EOL; //割り算 3
echo 10/3 . PHP_EOL; //割り算 3.3333333333333
echo 10%3 . PHP_EOL; //あまり 1
echo 2**8 . PHP_EOL; //2の8乗 256
浮動小数点における誤差の問題
浮動小数点の正体はあいまいな小数点だった
PHPに限らず、多くのプログラミング言語では浮動小数点には精度による誤差の問題というものが存在し、直接演算子で計算を行うのは推奨されません。
理由は浮動小数点は「近似値」だからです。
これが「浮動」小数点という名前の由来です。
$number = 0.1;
これは一見0.1に見えますが、実際は違います。
どういうことかわかりませんよね?
実際にもっと桁数を表示してみましょう
echo number_format(0.1, 30); //0.1を小数点30桁まで表示
出力結果はこれです。
0.100000000000000005551115123126
だいたい0.1ですが、正確には0.1じゃないですね・・・
こうなる理由は以下です。
- ①人が10進法で表現するのに対し、コンピュータは内部で2進法で持つ
- ②小数を2進法で表現すると循環小数(0.333333..のような無限の小数)となり、お互いの完全な変換ができない
このように浮動小数点の計算には多少の誤差が生じる場合があります。
浮動小数点の計算は直接算術演算子を使うかわりに次のような専用の関数を使います。
関数名 | 役割 |
bcadd | 加算 |
bcsub | 除算 |
bcmul | 乗算 |
bcdiv | 除算 |
bccomp | 比較 |
浮動小数点はあいまいな値。「算術演算子で計算するのは危ない」と覚えておきましょう。
加算(インクリメント)と減算(デクリメント)
他のプログラミング言語にも存在しますが、PHPにも加算子によるインクリメントとデクリメントができます。
記号 | 役割 |
++ | 加算(インクリメント) |
— | 減算(デクリメント) |
加算、減算ともに前置と後置という使い方があります。
それぞれ計算してから代入するか、代入してから計算するかなのですが、実際の現場ではややこしい文法なので敬遠されがちで、シンプルに(++$i)のように前置のみを単体で使うことが多いです。減算も同様です。
echo "前置" . PHP_EOL;
$number = 99;
echo ++$number . PHP_EOL; //足してから出力→100
echo --$number . PHP_EOL; //引いてから出力→99
echo "後置" . PHP_EOL;
$number = 99;
echo $number++ . PHP_EOL; //出力してから足す 99
echo $number . PHP_EOL; //→100
echo $number-- . PHP_EOL; //出力してから引く 100
echo $number . PHP_EOL; //→99
また次のように文字列を含めた算術も可能です。データ型の章のキャストの項目で紹介したような変換が暗黙的にintegerやfloatなどの数値に解釈され実行されます。
ですが、意図しないバグの原因になったりもするので、実際の使用は推奨されませんが知識としては覚えておいてください。
echo 1 + "0.1" . PHP_EOL; // 1.1
echo "1" + "0.1" . PHP_EOL; // 1.1
echo 10 + "-1" . PHP_EOL; // 9
echo 1 + "99AA" . PHP_EOL; //AAが省略され1+99
echo true + true . PHP_EOL; //それぞれ1に数値変換され1+1=2
echo "" + "AAA" + "10" . PHP_EOL; //空文字やAAAは0と解釈された上で警告
以前、説明した通り文字列の結合のピリオド(.)と加算の(+)は間違えやすいので注意してください。
結合するつもりで+を使ってしまうと暗黙の変換における加算がされてしまい、意図とは違う結果になりバグにつながることがあります。
マジカルインクリメント
前項でインクリメントを紹介しましたが、なんとPHPはアルファベットもインクリメントできます!A→B→Cといったように進められます。
<?php
$char = "A";
print $char;
++$char;
print $char;
++$char;
print $char;
?>
出力
ABC
コメント