PHPで数値の絶対値を取得する方法について

採用はこちら

PHPで数値の絶対値を取得するには、abs() 関数を使います。

絶対値とは、簡単に言うと「0からどれだけ離れているか」を表す値です。

そのため、負の数であっても、絶対値として取得すると0以上の値になります。

echo abs(-10); // 10
echo abs(10);  // 10
echo abs(0);   // 0

負の数は正の値になり、正の数や0はそのまま返されます。

目次

abs() 関数の基本

abs() の構文

abs() 関数の基本的な書き方は次の通りです。

abs(int|float $num): int|float

abs() は、整数または小数を引数に受け取り、その絶対値を返します。

例えば、次のように使います。

$number = -123;

$result = abs($number);

echo $result;

出力結果は次の通りです。

123

-123 の絶対値は 123 なので、結果として 123 が表示されます。

正の数を渡した場合

すでに正の数を渡した場合は、そのままの値が返されます。

echo abs(25);

出力結果:

25

25 はもともと0以上の値なので、abs() を使っても値は変わりません。

負の数を渡した場合

負の数を渡すと、符号が取り除かれて0以上の値になります。

echo abs(-25);

出力結果:

25

このように、-2525 として取得できます。

0を渡した場合

0の絶対値は0です。

echo abs(0);

出力結果:

0

0は正の数でも負の数でもありませんが、絶対値としてはそのまま0になります。

小数の絶対値を取得する

小数にも abs() は使える

abs() は整数だけでなく、小数にも使用できます。

echo abs(-3.14);

出力結果:

3.14

小数を渡した場合も、負の符号が取り除かれて0以上の値が返されます。

小数を使った実用例

例えば、価格差や割合差、平均との差などを扱う場合に便利です。

$priceDiff = -12.5;

echo abs($priceDiff);

出力結果:

12.5

このように、差の向きではなく「どれくらい差があるか」だけを知りたい場合に abs() はよく使われます。

abs() の戻り値の型

整数を渡すと整数が返る

abs() に整数を渡した場合、戻り値も整数になります。

var_dump(abs(-10));

出力結果:

int(10)

小数を渡すと小数が返る

一方で、小数を渡した場合は戻り値も小数になります。

var_dump(abs(-10.5));

出力結果:

float(10.5)

つまり、abs() は渡した値の型に応じて、int または float を返します。

var_dump(abs(-10));   // int(10)
var_dump(abs(-10.5)); // float(10.5)

2つの数値の差を絶対値で取得する

差分を常に0以上の値にする

abs() は、2つの数値の差を求めるときによく使われます。

例えば、次のように2つの値を引き算すると、計算する順番によって結果が負の数になることがあります。

$a = 80;
$b = 120;

$difference = $a - $b;

echo $difference;

出力結果:

-40

この場合、$a - $b の結果は -40 になります。

しかし、「差が40ある」ということだけを知りたい場合は、マイナスの符号は不要です。

そのようなときに abs() を使います。

$a = 80;
$b = 120;

$difference = abs($a - $b);

echo $difference;

出力結果:

40

abs($a - $b) と書くことで、差分を常に0以上の値として取得できます。

数値の差を求めるときの定番パターン

2つの数値の差を絶対値で取得したい場合は、次の形がよく使われます。

$diff = abs($a - $b);

例えば、スコア差、価格差、在庫数の差、座標の差などを求めるときに便利です。

実用例

平均点との差を求める

ある点数が平均点からどれくらい離れているかを求める例です。

$score = 72;
$average = 80;

$diff = abs($score - $average);

echo "平均との差は {$diff} 点です。";

出力結果:

平均との差は 8 点です。

この例では、点数が平均より上か下かではなく、「平均との差が何点あるか」を取得しています。

価格差を求める

新旧価格の差額を求める場合にも abs() は便利です。

$oldPrice = 9800;
$newPrice = 7500;

$priceDiff = abs($oldPrice - $newPrice);

echo "価格差は {$priceDiff} 円です。";

出力結果:

価格差は 2300 円です。

$oldPrice - $newPrice の結果が正でも負でも、abs() を使えば差額を0以上の値として取得できます。

目標値との差を求める

現在の数値と目標値の差を求める場合にも使えます。

$currentStock = 35;
$targetStock = 50;

$gap = abs($currentStock - $targetStock);

echo "目標との差は {$gap} 個です。";

出力結果:

目標との差は 15 個です。

このように、在庫数や売上目標、進捗率などの差分を求める場面でも abs() は役立ちます。

文字列の数値を扱う場合

数値文字列は事前にチェックすると安全

PHPでは、フォーム入力やCSV、APIレスポンスなどから取得した値が文字列になっていることがあります。

例えば、次のような値です。

$value = "-100";

数値として解釈できる文字列であれば、環境によっては abs() で処理できる場合があります。

echo abs("-100");

出力結果:

100

ただし、abs() は本来、整数または小数を渡す関数です。

そのため、実務では文字列をそのまま渡すよりも、事前に数値かどうかを確認し、必要に応じてキャストしてから使うほうが安全です。

$value = "-100";

if (is_numeric($value)) {
    echo abs((float) $value);
} else {
    echo "数値ではありません";
}

数値ではない文字列には注意する

数値ではない文字列を abs() に渡すと、エラーになる可能性があります。

echo abs("abc");

このようなコードは避けるべきです。

外部から受け取った値を扱う場合は、次のように is_numeric() で確認してから処理すると安全です。

$input = $_POST['amount'] ?? null;

if (is_numeric($input)) {
    $amount = abs((float) $input);
    echo "金額は {$amount} です。";
} else {
    echo "正しい数値を入力してください。";
}

フォーム入力で abs() を使う場合の注意点

マイナス値を補正してよいか確認する

フォーム入力で負の値が送られてきた場合、abs() を使えば正の値に変換できます。

$input = $_POST['amount'] ?? null;

if (is_numeric($input)) {
    $amount = abs((float) $input);
    echo "金額は {$amount} です。";
} else {
    echo "正しい数値を入力してください。";
}

このコードでは、ユーザーが -500 と入力しても 500 として扱われます。

ただし、金額や数量などの入力では、マイナス値を自動的に正の値へ変換するのが適切とは限りません。

ユーザーの入力ミスや不正な値を見逃してしまう可能性があるためです。

マイナス値を許可しない場合はエラーにする

購入金額や注文数量のように、マイナス値が不正な場合は、abs() で補正するよりもバリデーションエラーにするほうが自然です。

$input = $_POST['amount'] ?? null;

if (!is_numeric($input)) {
    echo "数値を入力してください。";
} elseif ($input < 0) {
    echo "マイナスの金額は入力できません。";
} else {
    echo "金額は {$input} 円です。";
}

このように、入力値の意味によって abs() を使うべきかどうかを判断することが大切です。

差分や距離を求めたい場合は abs() が便利ですが、入力値そのものを検証したい場合は、バリデーション処理を行いましょう。

配列内の数値をすべて絶対値にする

array_map() を使う方法

配列内の数値をまとめて絶対値にしたい場合は、array_map()abs() を組み合わせると便利です。

$numbers = [-10, 20, -30, 40, -50];

$result = array_map('abs', $numbers);

print_r($result);

出力結果:

Array
(
    [0] => 10
    [1] => 20
    [2] => 30
    [3] => 40
    [4] => 50
)

array_map('abs', $numbers) と書くことで、配列内の各要素に対して abs() を適用できます。

foreach を使う方法

1つずつ処理したい場合は、foreach を使っても問題ありません。

$numbers = [-10, 20, -30, 40, -50];

foreach ($numbers as $number) {
    echo abs($number) . PHP_EOL;
}

出力結果:

10
20
30
40
50

新しい配列として結果を受け取りたい場合は array_map()、単純に1つずつ表示したい場合は foreach が分かりやすいです。

abs() を使わずに絶対値を求める方法

条件分岐で求める

abs() を使わずに絶対値を求めることもできます。

$number = -10;

if ($number < 0) {
    $result = $number * -1;
} else {
    $result = $number;
}

echo $result;

出力結果:

10

負の数であれば -1 を掛けて正の値にし、0以上であればそのまま返すという考え方です。

三項演算子で書く

三項演算子を使うと、より短く書けます。

$number = -10;

$result = $number < 0 ? -$number : $number;

echo $result;

出力結果:

10

ただし、PHPには標準で abs() が用意されているため、通常は自作する必要はありません。

$result = abs($number);

可読性や保守性を考えても、絶対値を取得したい場合は abs() を使うのが基本です。

abs() を使うときの注意点

増減の向きは分からなくなる

abs() を使うと、負の符号が取り除かれます。

そのため、差分の大きさは分かりますが、増えたのか減ったのかは分からなくなります。

$before = 100;
$after = 80;

$diff = abs($after - $before);

echo $diff;

出力結果:

20

この結果からは、20増えたのか、20減ったのかは判断できません。

増減の向きも知りたい場合は、abs() を使わずにそのまま計算します。

$before = 100;
$after = 80;

$diff = $after - $before;

echo $diff;

出力結果:

-20

この場合は -20 なので、20減ったことが分かります。

入力値の不正チェックには使わない

abs() は、あくまで絶対値を取得するための関数です。

入力値が正しいかどうかを検証する関数ではありません。

例えば、次のようなコードには注意が必要です。

$quantity = -3;

$quantity = abs($quantity);

echo $quantity;

出力結果:

3

このコードでは、-33 に変換されます。

しかし、注文数量として -3 が入力されていた場合、本来はエラーとして扱うべきかもしれません。

このような場合は、次のようにバリデーションを行うほうが適切です。

if ($quantity < 0) {
    echo "数量は0以上で入力してください。";
}

小数の比較では誤差に注意する

abs() は小数にも使えますが、小数の計算では浮動小数点数の誤差が発生することがあります。

例えば、次のようなケースです。

$diff = abs(0.1 + 0.2 - 0.3);

var_dump($diff);

数学的には 0 になりそうですが、実際には非常に小さな誤差が残る場合があります。

小数同士を比較する場合は、完全一致ではなく、許容誤差を使うことがあります。

$a = 0.1 + 0.2;
$b = 0.3;

$epsilon = 0.00001;

if (abs($a - $b) < $epsilon) {
    echo "ほぼ等しい";
}

このように、差が一定以下であれば「ほぼ等しい」と判断します。

abs() のよくある使いどころ

差分を正の値で取得したい場合

$diff = abs($a - $b);

2つの数値の差を、常に0以上の値として取得できます。

価格差を求めたい場合

$priceDiff = abs($oldPrice - $newPrice);

旧価格と新価格の差額を求めるときに使えます。

スコア差を求めたい場合

$scoreDiff = abs($scoreA - $scoreB);

2つのスコアの差を求めるときに便利です。

座標や距離の差を求めたい場合

$xDiff = abs($x1 - $x2);

座標間の差や距離の計算でも使われます。

前回値との差を求めたい場合

$change = abs($current - $previous);

現在値と前回値の差を、変化量として取得できます。

ただし、増減の方向を知りたい場合は abs() を使わず、符号付きの差分をそのまま扱いましょう。

まとめ

PHPで数値の絶対値を取得するには、abs() 関数を使います。

echo abs(-100);   // 100
echo abs(100);    // 100
echo abs(-12.34); // 12.34

整数にも小数にも使うことができ、負の数を0以上の値として取得できます。

2つの数値の差を常に0以上で取得したい場合は、次のように書きます。

$diff = abs($a - $b);

abs() は、価格差、スコア差、平均との差、座標の差、変化量などを求める場面で便利です。

ただし、abs() を使うと符号が消えるため、増えたのか減ったのかは分からなくなります。

また、フォーム入力などでマイナス値が不正な場合は、abs() で正の値に変換するのではなく、バリデーションエラーとして扱うほうが適切です。

abs() は「差の大きさ」や「0からの距離」を求めたいときに使う関数だと覚えておくとよいでしょう。

以上、PHPで数値の絶対値を取得する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次