GoogleAppsScript

【GAS】小数を四捨五入して整数にする|負の数の四捨五入の注意点と対策

小数を四捨五入する方法

Google Apps Script(GAS)で小数を四捨五入して整数にするMath.roundメソッドを解説します。

Math.roundメソッドの書式や具体例、負の数を四捨五入する際の注意点と問題の対処方法を紹介しています。

小数を四捨五入する方法

メソッド動作
Math.round()小数点以下を四捨五入する

Math.roundメソッド(四捨五入)とは

Math.round()関数は、小数点以下を四捨五入するために使用されます。

この関数は、任意の数値を受け取り、最も近い整数に丸めた結果を返します。

整数に丸めるとは

与えられた小数の部分を四捨五入や切り捨てなどの方法で、最も近い整数に変換することを指します。

Math.roundメソッドの書式

書式

Math.round(数値)

引数タイプ動作
数値Integer指定した数値の小数点以下を四捨五入します。

Math.roundメソッドの具体例

let num1 = 12.34;
let num2 = 56.78;

Math.round(num1);  // 12
Math.round(num2); // 57

上記の例では、Math.round()関数を使用してnum1とnum2の値を丸めています。

num1は小数点以下が0.34なので、最も近い整数である12に丸められ、rounded1には12が格納されます。

同様に、num2は0.78なので、最も近い整数である57に丸められ、rounded2には57が格納されます。

負の値を四捨五入する際の注意点と対策方法

Math.round()メソッドは、負の数を引数においた際に予想外の結果が生じるため、注意が必要です。

「-5.49」,「-5.5」,「-5.51」の処理の違い

「-5.49」,「-5.5」,「-5.51」の処理のまとめ

結論ですが、「-〇.5」という負の数の処理で正しい結果を出力できません

下記では「-5.5」を例に挙げてますが、「-3.5」「-7.5」などでも同様に間違った結果を出してしまいます。

これは、システム上で負の数の浮動小数点の誤差が起きているのが原因のようです。

「-〇.5」という負の数を、誤差によって実質「-〇.5」未満として四捨されています。

変換前の値四捨五入(Math.round)
-5.49-5
-5.5-5(-6にならない)
-5.51-6

例: -5.49の丸め

-5.49という数値をMath.round()メソッドで丸める場合を考えてみましょう。

通常の期待値

-5.49は0.5未満なので、最も近い整数である-5に切り捨てられるでしょう。

実際の処理結果

-5.49は-5に期待通り切り捨てられます。

let roundedValue = Math.round(-5.49);
console.log(roundedValue); // -5

例: -5.5の丸め

-5.5という数値をMath.round()メソッドで丸める場合を考えてみましょう。

通常の期待値

-5.5は0.5以上なので、最も近い整数である-6に切り上げられるでしょう。

実際の処理結果

-5.5は誤差で-5に切り捨てられます。

let roundedValue = Math.round(-5.5);
console.log(roundedValue); // -5

例: -5.51の丸め

-5.51という数値をMath.round()メソッドで丸める場合を考えてみましょう。

通常の期待値

-5.51は0.5以上なので、最も近い整数である-6に切り上げられるでしょう。

実際の処理結果

-5.51は-6に期待通り切り上げられます。

let roundedValue = Math.round(-5.51);
console.log(roundedValue); // -6

このように、負の数をMath.round()メソッドで丸める際、内部表現の誤差により期待通りの結果が得られないことがあります。

では、この現象に対処する方法を見てみましょう。

対処方法

Math.floor()やMath.ceil()というメソッドを活用することで、実際の四捨五入と同じ処理を実現させることができます。

GASで小数点以下を整数に変換
【GAS】 小数点以下の切り上げ・切り下げ・切り捨てをする方法を解説 Google Apps Script(GAS)を使用して、数値操作を行う際に小数点以下を適切に処理する方法は重要です。 この記事...

スクリプト例

function customRound(number) {
  // 数値が正の場合
  if (number >= 0) {
    // 小数点以下が0.5以上の場合、Math.ceil()を使用して上に丸める
    if (number % 1 >= 0.5) {
      return Math.ceil(number);
    }
    // それ以外の場合、Math.floor()を使用して下に丸める
    return Math.floor(number);
  }
  // 数値が負の場合
  else {
    // 小数点以下が-0.5以下の場合、Math.floor()を使用して下に丸める
    if (number % 1 <= -0.5) {
      return Math.floor(number);
    }
    // それ以外の場合、Math.ceil()を使用して上に丸める
    return Math.ceil(number);
  }
}

console.log(customRound(-5.5));  // -6
console.log(customRound(-5.49)); // -5
console.log(customRound(-5.51)); // -6
console.log(customRound(5.49));  // 5
console.log(customRound(5.5));   // 6
console.log(customRound(5.51));  // 6

解説

数値が正の場合
  • 関数はまず、数値が正かどうかを確認します。正の場合は次の条件に従います。
  • number % 1 を使って、数値の小数部分を取得します。この値が0.5以上の場合、Math.ceil() を使用して上に丸めます。
  • それ以外の場合、Math.floor() を使用して下に丸めます。
数値が負の場合
  • 同様に number % 1 を使って、数値の小数部分を取得します。
  • この値が-0.5以下の場合、Math.floor() を使用して下に丸めます。
  • それ以外の場合、Math.ceil() を使用して上に丸めます。

上記のスクリプトでは、与えられた数値を正確に丸めるための条件分岐ロジックを持っており、正と負の数値に対して適切な丸め結果を出力することができます