他の言語と同様、PHP の数値はバイナリシステム (1 と 0 の組み合わせ) で表されるので、いくつかの数学演算では期待した結果とは若干異なる結果が得られる可能性があります。このページでは、さまざまなコンテキストでの計算の動作の概要を説明します。理解するためには、少なくとも**数値計算技術**と**数系**の基礎知識が必要です。
数値の表現方法はデータ型によって特徴付けられ、例えば整数はソースコードから直接10進数から2進数に変換される。数字の変換を気にする必要はまったくなく、すべて自動で行われるのです。
この変換の結果、整数の最大値はメモリで利用可能なビット数で決定される。32 ビットの PHP では -2,147,483,648
から -2,147,483,647
(~ ± 20 億)、64 ビットの PHP では -9,223,372,036,854,775,808
から -9,223,372,036,854,775,807
(~ ± 9 quintillion) までが範囲である。最大値は、定数 PHP_INT_MAX
をコールすることで常に取得することができる。
10進数は float データ型に格納されるが,このデータ型は精度に限界があるため,内部的には mantissa * (2^exponent)
という数学演算を受ける数値の組として格納される.その結果、少ないビット数で比較的大きな数(数十億のオーダー)を記憶することができるようになったのだが、ただあまり正確ではない。
データ型として float を使用した結果、1 - 0.9
の計算結果が正確に 0.1
にならないことがあります。
ウェブフォーラムからの例です。
$x = 0.3;$y = 0.4;echo 0.7 - $x - $y; // prints -5.5511151231258E-17
数字を少し調整すると
$x = 6.5;$y = 7.5;echo 14.0 - $x - $y; // 0を表示する
一般に、この問題については、VTM.e15.cz: Why computers have problems with decimal の別の記事で議論されていますし、Wikipedia の浮動小数点についても一般に議論されています。
一般的には、計算後に結果を丸めるか、小数を完全に避けるのがよいでしょう。例えば、価格をクラウン(14.90のような)ではなく、ペニー(1490のような)で保存し、それを正確に操作することです。丸め方については、次の項目で説明します。
$a = 5;$b = 3;echo $a + $b;
演算には、数学のルールに従って演算子の優先順位を尊重する、一般的な数学的慣習を用いることができます(乗算は加算に優先する、など)。値は直接書き込むことも、変数を介して読み込むこともできる。
一見するとわからないかもしれませんが、数学の例では、等号(
=
)は書かれていません。したがって、単純な「二項演算」しか解くことができず、それは常に「2つの要素」だけで動作します(方程式を数えてはいけません、そのためには専用のライブラリを使用する必要があります)。
result
の欄には、何を想定してプリントされているのかを列挙しています。
$a = 5;$b = 3;$c = 10;
操作方法|マーク|表記例|結果 |
---|
加算|+ |プラス|echo $a + $b; |8 |
引き算| - | マイナス| echo $a - $b; | 2 |
乗算|* |アスタリスク|echo $a * $b; |15 |
分割|/ |スラッシュ|echo $a / $b; |1.666666667 |
括弧|( ) |括弧|echo $a + ($b * $c); |
文字列の連結|. |ピリオド|echo $a . $b . $c; |5310 |
分割後の余り|%|パーセント| echo $a % $b;`|2 |
1つのプラスを加える |
1を引く |
パワー|***|アスタリスク2つ|echo $a ** $b;`|125 |
power 演算子 (ダブルアスタリスク) は PHP 7.1 以降で利用可能です。 その他のバージョンの PHP では、汎用関数
pow($a, $b)
を使用する必要があります。
一般的な計算タスクを解決する場合、ほとんどの場合、すでにPHPに直接関数が存在します。
通常の丸めはround()関数で行い、3つのパラメータを持っています。
round(5); // 5round(5.1); // 5round(5.4); // 5round(5.5); // 6round(5.8); // 6round(5483.47621, 2); // 5483.47round(5483.47621, -2); // 5500
また、切り捨てのためのfloor() 関数と切り上げのためのceil() 関数がある。
**Watch out for data types!
すべての丸め関数は、結果が整数であっても、結果を
float
として返します。結果を整数値として扱いたい場合は、結果をオーバータイプすることが重要です。例:
echo (int) round(3.14);
.
PHP はさまざまなデータ型を扱います。たとえば float の場合、 round()
の結果が有限の小数展開を持つ数でないことは容易に起こりえます。出力には、後述する number_format()
関数を使用することをお勧めします。
これらは、さまざまな計算に使われ、単位円に基づいています。例えば、円、楕円、変位などの作図に使用される。
xと
y` の間の角度を計算しなさい。直交座標と極座標の変換。
単位双曲線に基づく。その定義は、比喩を使って簡単に説明することができます。
例えば、地形生成や物理シミュレーションに利用されています。
単位双曲線に基づく。
echo sin(30); // -0.98803162409286echo sin(deg2rad(30)); // 0.5echo cos(deg2rad(123)); // -0.54463903501503echo 1/tan(deg2rad(45)); // 1(オネン・コタンジェント)echo sin(deg2rad(500)); // 0.64278760968654echo atan2(deg2rad(50), deg2rad(23)); // 1.1396575860761
5+2^(1+3/2)` のような数式をユーザ文字列として処理する必要がある場合があります。
このような入力をPHPで簡単に処理する方法はありませんが、私はこの問題に対処する一連のライブラリをプログラミングしています。
詳しくは別記事Calculator in PHP: 数式を文字列として処理するを参照してください。
大きな数字や小数は、PHPではfloatとして保存されます。さらに、小数点以下15桁程度に丸められますが、これは時に煩わしいことです。そこで、BCMath Arbitrary Precision Mathematics libraryが作られました。
このライブラリでは数値は文字列で表現されるので、floatの不正確さに制限されないが、実行される演算は数桁遅くなる(それでもこのような関数を自分でプログラミングした場合よりは速い)。
例えば、小数点以下2桁から3桁までの平方根を求めたい場合は、次のように呼び出すだけである。
echo bcsqrt('2', 3); // 1.414
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | ja