JavaScript

JavaScriptのMath.trunc():小数部を除いて差分時間を整数の分に変換する

この記事でわかること

Math.trunc()で正負の数から小数部を取り除く方法を解説。差分時間を分に変換する実例、引数・戻り値、ブラウザーとNode.jsの実行手順、負のゼロや入力検証の注意点を学べます。

予定との差を秒で受け取り、分単位の整数で表示したい場合があります。たとえば、予定より125秒遅ければ2分、125秒早ければマイナス2分と表示する処理です。

こうした「符号の向きによらず小数部を除く」処理には、Math.trunc()が適しています。この記事では、この関数の基本から、入力検証を備えた差分時間の変換までを説明します。

Math.trunc()の目的と基本動作

Math.trunc()は、与えた数値の小数部を取り除いて整数部を返す静的メソッドです。正数と負数のどちらも、ゼロに近づく方向へ処理します。インスタンスを作らず、Math.trunc(x)の形で呼び出します。MDNのMath.trunc()リファレンス

JavaScript
console.log(Math.trunc(7.8));
console.log(Math.trunc(-7.8));
console.log(Math.trunc(7));

期待出力は次のとおりです。

CODE
7
-7
7

「切り捨て」の方向を明確にする

日本語で「小数点以下を切り捨てる」とだけ説明すると、負数の扱いが曖昧になります。Math.trunc(-7.8)は-7ですが、負の無限大方向へ丸めるMath.floor(-7.8)は-8です。

差分の絶対的な大きさから端数を除きたい場合は、ゼロ方向への処理が合います。一方、負数を含む座標を区画へ割り当てる場合などは、別の丸め方が必要になることがあります。先に業務上のルールを決めてから関数を選びましょう。

動作環境と対応バージョン

確認日は2026年10月16日です。Math.trunc()はブラウザーとNode.jsの両方で使用できます。DOMや外部パッケージには依存しません。

MDNでは、2015年7月以降に主要ブラウザーで広く利用できる機能とされています。ただし、この説明を古いブラウザーまで含む動作保証とは解釈しないでください。MDNの対応状況

本記事のコードは、現行のChrome、Edge、Firefox、Safari、およびNode.js 22以降を対象にします。このNode.jsの指定は記事全体の実行対象であり、Math.trunc()自体の導入バージョンを示すものではありません。Node.jsはV8を利用してJavaScriptを実行します。Node.jsのECMAScript対応の説明

古い環境を対象に含める場合は、次の存在確認も行えます。ただし、存在確認だけで後続コードのすべての構文やAPIへの対応を保証できるわけではありません。

JavaScript
console.log(typeof Math.trunc === "function");

対応環境での期待出力はtrueです。

引数・戻り値と特殊な入力

構文はMath.trunc(x)です。

  • 引数xには、整数部を取り出したい数値を渡します。
  • 戻り値はnumber型です。整数専用の別の型になるわけではありません。
  • 元の変数を書き換えず、計算結果を返します。
  • 処理は同期的に完了します。Promiseを返さないため、awaitは不要です。

数値以外の値を渡すと、数値への変換が行われます。たとえば数値を表す文字列も処理できてしまいます。アプリケーション側で数値だけを受け付けたい場合は、呼び出す前に入力を検証します。

負のゼロと数値以外の値

JavaScript
console.log(Math.trunc("8.9"));
console.log(Number.isNaN(Math.trunc("invalid")));
console.log(Math.trunc(Infinity));
console.log(Object.is(Math.trunc(-0.5), -0));

try {
  Math.trunc(8n);
} catch (error) {
  console.log(error.name);
}

期待出力は次のとおりです。

CODE
8
true
Infinity
true
TypeError

NaNや無限大が、通常の整数へ自動的に修復されるわけではありません。また、BigIntはこの関数で処理できません。

-0.5の整数部は-0です。負のゼロが表示に不要なら、後述のように結果がゼロの場合に0を返します。ただし、符号を計算上の情報として扱う用途では、必要性を判断してから正規化してください。

差分秒を整数の分へ変換する

ここでは、正数を予定からの遅れ、負数を予定より早い差分として扱います。125秒を2分、-125秒を-2分へ変換します。

独自関数toWholeMinutes()は、安全な整数で表された秒数だけを受け付ける設計です。小数の秒数、文字列、NaN、無限大を拒否します。これは用途に合わせた制約であり、Math.trunc()そのものの入力制約ではありません。

自己完結したコード

以下をまとめてコピーしてください。外部通信、追加ライブラリー、事前の変数定義は不要です。

JavaScript
(() => {
  "use strict";

  function toWholeMinutes(seconds) {
    if (!Number.isSafeInteger(seconds)) {
      throw new TypeError("secondsには安全な整数を指定してください");
    }

    const minutes = Math.trunc(seconds / 60);
    return minutes === 0 ? 0 : minutes;
  }

  const samples = [125, -125, 59, -59, 60, -60];

  for (const seconds of samples) {
    console.log(`${seconds}秒 => ${toWholeMinutes(seconds)}分`);
  }

  console.log(`負のゼロ: ${Object.is(toWholeMinutes(-59), -0)}`);

  try {
    toWholeMinutes("125");
  } catch (error) {
    console.log(`${error.name}: ${error.message}`);
  }
})();

期待出力は次のとおりです。これは仕様に基づいて静的に確認した結果であり、実機で実行した記録ではありません。

CODE
125秒 => 2分
-125秒 => -2分
59秒 => 0分
-59秒 => 0分
60秒 => 1分
-60秒 => -1分
負のゼロ: false
TypeError: secondsには安全な整数を指定してください

処理を追う

まず入力を検証し、秒数を60で割ります。次にMath.trunc()で分の端数を除きます。最後の条件式は、結果が0または-0なら通常の0へそろえる処理です。

125 / 60と-125 / 60はそれぞれ約2.0833と-2.0833なので、戻り値は2と-2になります。1分未満の差は、正負のどちらも表示上の0にそろえます。

安全な整数の範囲は、両端を含む-9007199254740991から9007199254740991です。範囲外では異なる整数を区別できなくなる場合があります。MDNの安全な整数の説明

ブラウザーとNode.jsで実行する方法

ブラウザーでの実行

現行ブラウザーで空のタブを開き、開発者ツールのConsoleを選びます。「自己完結したコード」のJavaScript全体を貼り付けて実行してください。HTMLファイルや開発サーバーは必要ありません。

出力の末尾にコンソールが式の評価結果としてundefinedを追加表示する場合があります。これはコード中のログとは別の表示です。Consoleが貼り付けを制限している場合は、そのブラウザーの案内に従ってコードを入力してください。

Node.jsでの実行

Node.js 22以降をインストールした環境で、コード全体をUTF-8のtrunc-minutes.jsとして保存します。ターミナルで保存先のフォルダーへ移動し、次のコマンドを実行します。

Shell
node --version
node trunc-minutes.js

最初のコマンドでバージョンを確認し、次のコマンドでプログラムを実行します。パッケージのインストールは不要です。ファイル名をnodeへ渡す実行方法は、Node.js公式のスクリプト実行ガイドでも説明されています。

失敗例と制約

ビット演算で代用すると値が変わる

小数部を除くために| 0を使うコードを見かけますが、これは符号付き32ビット整数への変換を伴います。大きな値では結果が異なります。

JavaScript
console.log(Math.trunc(3000000000.5));
console.log(3000000000.5 | 0);

期待出力は次のとおりです。

CODE
3000000000
-1294967296

一般的な数値の整数部を取り出す目的なら、意図が直接伝わるMath.trunc()を使うほうが読みやすく、32ビット変換の問題も避けられます。MDNのビット演算に関する注意

表示用の丸めと判定用の値を分ける

差分が-59秒でも表示は0分になります。早着か遅延かを判定する際に、この丸めた結果だけを使うと情報が失われます。元の秒数を保持し、表示用の値だけを変換してください。

また、Math.trunc()は浮動小数点演算で生じた誤差を修復する機能ではありません。金額や厳密な小数計算へ転用する際は、数値の持ち方と端数処理の規則を別途設計する必要があります。

活用事例と実装の改善案

差分秒から整数の分を作る処理は、予定と実績を比較する管理画面や、処理時間の差を簡潔に表示するログに使えます。正負を対称に扱い、端数を表示しないという要件に合う場面で採用してください。

実務では、toWholeMinutes()のような変換関数へ表示規則を集めることを勧めます。画面ごとに直接計算すると、負数の丸め方やゼロ表示がばらつきやすいためです。さらに、秒数の正負が何を意味するかを引数の説明に残すと、後から利用する人も判断しやすくなります。

公式参考資料

PREFERRED SOURCES

Googleの優先するニュース提供元にSEの部屋を追加

Googleで、いつも読みたい情報源を選べます。登録可否はGoogleの画面で確認できます。

Googleの設定画面で確認する 新しいタブで開きます

候補にSEの部屋が表示されない場合は、まだ追加できません。

y.
WRITTEN BY

y_ymo10

SEの部屋で、HTML・CSSからJavaScript・React・Next.jsまで、Web制作の開発ノートを公開しています。

ほかの開発ノートを読む →