JavaScriptにおける数値演算とエラー処理の完全ガイド

JavaScriptの数値演算とエラー処理は、開発者がコードを書く際に避けて通れない重要なトピックです。数値演算は多くのアプリケーションで基本的な操作であり、正確な結果を得るためにはその仕組みを理解することが不可欠です。また、エラー処理はプログラムの信頼性と安定性を保つために欠かせない要素です。本記事では、JavaScriptにおける数値型の基本から、数値演算における精度の問題、エラーの種類とその対策、さらには応用例や演習問題まで、包括的に解説していきます。これにより、JavaScriptの数値演算とエラー処理の知識を深め、実務に役立つスキルを身につけることができます。

目次

JavaScriptの数値型の基本

JavaScriptには数値を表すための基本的なデータ型があります。数値型には整数と浮動小数点数の両方が含まれますが、JavaScriptではこれらを区別せず、すべての数値は同じNumber型として扱われます。

整数と浮動小数点数

JavaScriptでは、整数と浮動小数点数の区別はありません。数値は64ビットの浮動小数点数(IEEE 754標準)として内部的に表現されます。これにより、大きな数や非常に小さな数を扱うことができます。

let integer = 42;         // 整数
let float = 3.14;         // 浮動小数点数
let scientific = 1.2e6;   // 科学表記

特殊な数値

JavaScriptには、特定の状況で使用される特殊な数値も存在します。

  • Infinity:正の無限大を表します。0で割った場合や非常に大きな数を計算した場合に生成されます。
  • -Infinity:負の無限大を表します。
  • NaN:Not-a-Numberの略で、数値として解釈できない計算の結果を表します。
console.log(1 / 0);         // Infinity
console.log(-1 / 0);        // -Infinity
console.log(Math.sqrt(-1)); // NaN

数値型のチェック

数値かどうかを確認するために、typeof演算子を使用します。Number型は「number」として返されます。

let value = 42;
console.log(typeof value);  // "number"

このように、JavaScriptの数値型の基本を理解することで、より複雑な数値演算やエラー処理の際にも適切な対応が可能となります。

基本的な数値演算

JavaScriptでは、基本的な数値演算を簡単に行うことができます。ここでは、四則演算をはじめとする基本的な数値演算について説明します。

四則演算

JavaScriptは、足し算、引き算、掛け算、割り算の四則演算をサポートしています。以下に各演算の例を示します。

let a = 10;
let b = 5;

let sum = a + b;        // 足し算:15
let difference = a - b; // 引き算:5
let product = a * b;    // 掛け算:50
let quotient = a / b;   // 割り算:2

剰余演算

剰余演算は、割り算の余りを求める演算です。JavaScriptでは、%演算子を使用します。

let remainder = a % b;  // 剰余:0

インクリメントとデクリメント

インクリメント(++)とデクリメント(--)は、変数の値を1増減させる演算子です。これらは前置および後置で使用できます。

let x = 5;
x++;    // 後置インクリメント:xは6になる
++x;    // 前置インクリメント:xは7になる

x--;    // 後置デクリメント:xは6になる
--x;    // 前置デクリメント:xは5になる

べき乗演算

べき乗演算は、ある数を特定の指数で累乗する演算です。JavaScriptでは、**演算子を使用します。

let base = 2;
let exponent = 3;
let power = base ** exponent;  // 2の3乗:8

数値の型変換

JavaScriptでは、文字列から数値への変換が必要な場合があります。これにはparseIntparseFloat関数を使用します。

let str = "123";
let num = parseInt(str);   // 文字列を整数に変換:123

str = "123.45";
num = parseFloat(str);     // 文字列を浮動小数点数に変換:123.45

このように、JavaScriptでは基本的な数値演算を容易に行うことができます。これらの基本操作を理解しておくことで、より高度な数値処理を効率的に行うことができるようになります。

数学関数の活用

JavaScriptでは、Mathオブジェクトを使用して様々な数学関数を利用することができます。これにより、複雑な数学的計算も簡単に行うことが可能です。ここでは、よく使われる主要な数学関数について紹介します。

基本的な数学関数

Mathオブジェクトには、基本的な数学関数が多数用意されています。以下にいくつかの例を示します。

let x = -10;
let y = 3.14;

let absValue = Math.abs(x);      // 絶対値:10
let roundValue = Math.round(y);  // 四捨五入:3
let ceilValue = Math.ceil(y);    // 切り上げ:4
let floorValue = Math.floor(y);  // 切り捨て:3
let sqrtValue = Math.sqrt(16);   // 平方根:4
let powValue = Math.pow(2, 3);   // べき乗:8

三角関数

三角関数もMathオブジェクトで提供されています。以下に、いくつかの三角関数の例を示します。

let angle = Math.PI / 4;  // 45度(ラジアン)

let sinValue = Math.sin(angle);  // サイン:0.707
let cosValue = Math.cos(angle);  // コサイン:0.707
let tanValue = Math.tan(angle);  // タンジェント:1

let asinValue = Math.asin(0.707);  // アークサイン:0.785(ラジアン)
let acosValue = Math.acos(0.707);  // アークコサイン:0.785(ラジアン)
let atanValue = Math.atan(1);      // アークタンジェント:0.785(ラジアン)

対数関数と指数関数

対数関数と指数関数もMathオブジェクトで利用できます。

let expValue = Math.exp(1);       // 自然対数の底eの累乗:2.718
let logValue = Math.log(10);      // 自然対数:2.302
let log10Value = Math.log10(100); // 常用対数:2

乱数生成

乱数を生成するための関数もMathオブジェクトに含まれています。Math.random関数は、0以上1未満の疑似乱数を生成します。

let randomValue = Math.random();  // 例:0.123456789

特定の範囲内で乱数を生成するには、以下のように調整します。

let min = 1;
let max = 10;
let randomInRange = Math.floor(Math.random() * (max - min + 1)) + min;  // 1から10の範囲の乱数

定数

Mathオブジェクトは、数学でよく使われる定数も提供しています。

let pi = Math.PI;     // 円周率:3.14159...
let e = Math.E;       // 自然対数の底:2.71828...
let ln2 = Math.LN2;   // 2の自然対数:0.693
let ln10 = Math.LN10; // 10の自然対数:2.302

これらの数学関数を適切に活用することで、JavaScriptでの数値演算が大幅に強化され、複雑な計算も容易に行えるようになります。

浮動小数点の精度問題

JavaScriptでは、浮動小数点数の演算において精度の問題が生じることがあります。これは、数値が内部的に2進数の浮動小数点表現(IEEE 754)で扱われるためです。特に、非常に小さな数値や非常に大きな数値、または小数部分がある数値を扱う場合に問題が顕著になります。

浮動小数点の誤差

浮動小数点数は、正確な値を表現するのが難しい場合があります。例えば、0.1という数値は、2進数では無限に続く小数となり、正確に表現することができません。このため、以下のような計算結果に誤差が生じます。

let result = 0.1 + 0.2;
console.log(result);  // 0.30000000000000004

この例では、0.1と0.2を足した結果が0.3ではなく、0.30000000000000004となります。これは、浮動小数点の精度問題によるものです。

精度問題の対策

浮動小数点の精度問題に対処するための方法はいくつかあります。ここでは、一般的な対策を紹介します。

整数演算を使用する

小数点以下の値を避けるために、整数演算を使用する方法があります。例えば、金額を計算する場合、セント単位で計算を行い、最終的にドル単位に変換することができます。

let result = (0.1 * 100 + 0.2 * 100) / 100;
console.log(result);  // 0.3

適切な丸め処理を行う

計算結果を適切に丸めることで、精度問題を軽減することができます。toFixedメソッドや四捨五入を用いた丸め処理が一般的です。

let result = 0.1 + 0.2;
let roundedResult = Math.round(result * 100) / 100;
console.log(roundedResult);  // 0.3

外部ライブラリの利用

浮動小数点の精度問題を扱うための外部ライブラリを利用することも一つの方法です。例えば、decimal.jsbig.jsといったライブラリは、高精度の数値演算をサポートしています。

// decimal.jsを利用した例
let Decimal = require('decimal.js');
let a = new Decimal(0.1);
let b = new Decimal(0.2);
let result = a.plus(b);
console.log(result.toString());  // 0.3

これらの対策を講じることで、JavaScriptにおける浮動小数点の精度問題を効果的に管理し、正確な数値演算を行うことができます。

エラー処理の基本

JavaScriptでは、エラーが発生した際に適切に対処するためのエラー処理機構が用意されています。エラー処理を正しく行うことで、プログラムの信頼性と安定性を向上させることができます。ここでは、エラー処理の基本であるtry-catch文について解説します。

try-catch文

try-catch文は、エラーが発生する可能性のあるコードを安全に実行するための構文です。tryブロック内に実行したいコードを記述し、catchブロック内にエラーが発生した場合の処理を記述します。

try {
    // エラーが発生する可能性のあるコード
    let result = riskyOperation();
    console.log(result);
} catch (error) {
    // エラーが発生した場合の処理
    console.error("エラーが発生しました:", error.message);
}

finallyブロック

try-catch文には、エラーの発生に関わらず必ず実行されるfinallyブロックを追加することができます。リソースの解放や後処理を行うのに便利です。

try {
    // エラーが発生する可能性のあるコード
    let result = riskyOperation();
    console.log(result);
} catch (error) {
    // エラーが発生した場合の処理
    console.error("エラーが発生しました:", error.message);
} finally {
    // 必ず実行される後処理
    console.log("処理が終了しました");
}

throw文

throw文を使用して、独自のエラーを発生させることができます。これにより、特定の条件下で意図的にエラーを発生させ、catchブロックで処理することができます。

function validateNumber(num) {
    if (typeof num !== 'number') {
        throw new Error("数値が必要です");
    }
    return num;
}

try {
    let number = validateNumber("test");
    console.log(number);
} catch (error) {
    console.error("エラーが発生しました:", error.message);
}

エラーハンドリングのベストプラクティス

エラー処理を適切に行うためのベストプラクティスをいくつか紹介します。

エラーの具体的なメッセージを提供する

エラーメッセージは具体的でわかりやすいものにしましょう。これにより、エラーの原因を特定しやすくなります。

if (typeof num !== 'number') {
    throw new Error("入力された値が数値ではありません: " + num);
}

特定のエラーをキャッチする

複数の種類のエラーが発生する可能性がある場合、それぞれのエラーを特定して処理することが重要です。エラーオブジェクトのnameプロパティを使用して、エラーの種類を判別できます。

try {
    // エラーが発生する可能性のあるコード
} catch (error) {
    if (error.name === 'TypeError') {
        console.error("型エラーが発生しました:", error.message);
    } else {
        console.error("予期しないエラーが発生しました:", error.message);
    }
}

グローバルエラーハンドリング

window.onerrorprocess.on('uncaughtException')を使用して、未キャッチのエラーをグローバルに処理することもできます。

window.onerror = function(message, source, lineno, colno, error) {
    console.error("グローバルエラーが発生しました:", message);
};

// Node.jsの場合
process.on('uncaughtException', (error) => {
    console.error("未キャッチのエラーが発生しました:", error.message);
});

これらの基本的なエラー処理の方法を理解し、適用することで、JavaScriptアプリケーションの信頼性とメンテナンス性を大幅に向上させることができます。

数値演算におけるエラーの種類

数値演算を行う際には、様々な種類のエラーが発生する可能性があります。これらのエラーは、計算の正確性やプログラムの実行に影響を与えるため、適切に対処することが重要です。ここでは、数値演算に関連する主なエラーの種類とその原因について説明します。

ゼロ除算エラー

ゼロで割る操作を行うと、数学的に定義されていないため、エラーが発生します。JavaScriptでは、ゼロ除算はInfinityまたは-Infinityを返しますが、これは計算の結果としては不適切です。

let result = 10 / 0;
console.log(result);  // Infinity

NaN(Not-a-Number)エラー

数値として解釈できない演算が行われた場合、NaN(Not-a-Number)が返されます。NaNは、数値ではないことを示す特殊な値です。

let result = Math.sqrt(-1);
console.log(result);  // NaN

let invalidOperation = 0 / 0;
console.log(invalidOperation);  // NaN

オーバーフローとアンダーフロー

数値の範囲を超えた演算を行うと、オーバーフローやアンダーフローが発生します。オーバーフローは数値が非常に大きくなる場合、アンダーフローは数値が非常に小さくなる場合に発生します。JavaScriptでは、これらのエラーはInfinity-Infinityとして表現されることがあります。

let largeNumber = Number.MAX_VALUE;
let overflowResult = largeNumber * 2;
console.log(overflowResult);  // Infinity

let smallNumber = Number.MIN_VALUE;
let underflowResult = smallNumber / 2;
console.log(underflowResult);  // 0

丸め誤差

浮動小数点数の演算において、丸め誤差が発生することがあります。これは、浮動小数点数が有限のビットで表現されるため、正確な値を表現できない場合に生じます。丸め誤差は、特に小数点以下の計算で問題となります。

let result = 0.1 + 0.2;
console.log(result);  // 0.30000000000000004

精度の喪失

非常に大きな数や非常に小さな数を扱う際に、精度の喪失が発生することがあります。これにより、計算結果が正確でなくなることがあります。

let largeNumber = 1e16 + 1;
let precisionLoss = largeNumber - 1e16;
console.log(precisionLoss);  // 0

無限再帰によるスタックオーバーフロー

無限ループや無限再帰を含む数値計算は、スタックオーバーフローを引き起こす可能性があります。これは、再帰呼び出しが限界を超えると、プログラムがクラッシュする原因となります。

function recursiveFunction() {
    return recursiveFunction();
}

try {
    recursiveFunction();
} catch (error) {
    console.error("スタックオーバーフローが発生しました:", error.message);
}

これらの数値演算におけるエラーの種類を理解し、適切に対処することで、JavaScriptアプリケーションの安定性と信頼性を向上させることができます。エラーを予測し、適切なエラーハンドリングを実装することが重要です。

エラーの検出とデバッグ

数値演算におけるエラーを効果的に処理するためには、エラーの検出とデバッグの手法を理解しておくことが重要です。ここでは、エラーの検出方法とデバッグの手法について紹介します。

エラーの検出方法

コンソール出力

JavaScriptでエラーを検出する基本的な方法は、コンソールにエラーメッセージを出力することです。console.errorメソッドを使用することで、エラーが発生した箇所やエラーメッセージを確認することができます。

try {
    let result = riskyOperation();
} catch (error) {
    console.error("エラーが発生しました:", error.message);
}

条件分岐を使用したエラー検出

特定の条件に基づいてエラーを検出することもできます。例えば、ゼロ除算やNaNの発生を条件分岐でチェックします。

let divisor = 0;
if (divisor === 0) {
    console.error("ゼロ除算エラーが発生しました");
} else {
    let result = 10 / divisor;
    console.log(result);
}

let value = NaN;
if (isNaN(value)) {
    console.error("NaNエラーが発生しました");
}

デバッガの使用

ブラウザのデベロッパーツールやNode.jsのデバッガを使用して、実行中のコードをステップ実行し、変数の値やエラーの発生箇所を確認することができます。debuggerステートメントをコードに挿入することで、実行を一時停止してデバッグすることができます。

function calculate() {
    let a = 10;
    let b = 0;
    debugger;  // ここで実行が一時停止し、デバッグモードに入る
    return a / b;
}

calculate();

デバッグの手法

ステップ実行

デバッガを使用してコードをステップ実行することで、エラーの発生箇所や原因を特定できます。ステップオーバー、ステップイン、ステップアウトの操作を行いながら、コードの動作を詳細に追跡します。

ブレークポイントの設定

特定の行にブレークポイントを設定することで、その行で実行を一時停止し、変数の状態や実行フローを確認することができます。これにより、エラーが発生する前後の状況を詳細に調査できます。

ウォッチ式の利用

デバッガでは、特定の変数や式の値を監視するウォッチ式を設定できます。これにより、プログラムの実行中に変数の値がどのように変化するかをリアルタイムで確認できます。

ログ出力の活用

コンソールに変数の値や実行状況を出力することで、エラーの原因を特定しやすくなります。console.logconsole.errorを使用して、詳細なログを出力するようにしましょう。

function riskyOperation() {
    let x = 10;
    let y = 0;
    console.log("x:", x, "y:", y);  // 変数の値をログに出力
    if (y === 0) {
        console.error("ゼロ除算エラーが発生しました");
        return NaN;
    }
    return x / y;
}

let result = riskyOperation();
console.log("計算結果:", result);

これらのエラー検出とデバッグの手法を活用することで、数値演算におけるエラーを効果的に特定し、修正することができます。適切なデバッグ手法を身につけることで、コードの品質と信頼性を向上させることができます。

カスタムエラーの作成

JavaScriptでは、標準のエラーオブジェクトに加えて、独自のカスタムエラーを作成することができます。カスタムエラーを使用することで、特定の状況に応じたエラーメッセージやエラータイプを提供し、エラーハンドリングをより柔軟かつ効果的に行うことができます。

カスタムエラーの基本

カスタムエラーを作成するには、Errorオブジェクトを継承して新しいエラークラスを定義します。これにより、特定のエラータイプを表す独自のエラーオブジェクトを作成することができます。

class ValidationError extends Error {
    constructor(message) {
        super(message);
        this.name = "ValidationError";
    }
}

// カスタムエラーの使用例
function validateAge(age) {
    if (age < 0 || age > 120) {
        throw new ValidationError("年齢は0から120の間である必要があります");
    }
    return age;
}

try {
    let age = validateAge(-5);
} catch (error) {
    if (error instanceof ValidationError) {
        console.error("バリデーションエラーが発生しました:", error.message);
    } else {
        console.error("予期しないエラーが発生しました:", error.message);
    }
}

カスタムエラーの詳細情報を追加する

カスタムエラーには、エラーメッセージに加えて、追加のプロパティを持たせることができます。これにより、エラーに関する詳細な情報を提供し、デバッグやエラーハンドリングを容易にします。

class DetailedError extends Error {
    constructor(message, errorCode) {
        super(message);
        this.name = "DetailedError";
        this.code = errorCode;
    }
}

// カスタムエラーの使用例
function processTransaction(amount) {
    if (amount < 0) {
        throw new DetailedError("取引額は正の数である必要があります", 1001);
    }
    return `取引が成功しました: ${amount}`;
}

try {
    let result = processTransaction(-50);
} catch (error) {
    if (error instanceof DetailedError) {
        console.error(`エラーコード ${error.code}: ${error.message}`);
    } else {
        console.error("予期しないエラーが発生しました:", error.message);
    }
}

複数のカスタムエラーを使用する

アプリケーションの異なる部分で複数のカスタムエラーを使用することも可能です。これにより、各エラータイプに対して適切なハンドリングを行うことができます。

class AuthenticationError extends Error {
    constructor(message) {
        super(message);
        this.name = "AuthenticationError";
    }
}

class DatabaseError extends Error {
    constructor(message) {
        super(message);
        this.name = "DatabaseError";
    }
}

// カスタムエラーの使用例
function authenticateUser(username, password) {
    if (username !== "admin" || password !== "1234") {
        throw new AuthenticationError("認証に失敗しました");
    }
    return "認証に成功しました";
}

function queryDatabase(query) {
    if (query === "") {
        throw new DatabaseError("クエリが空です");
    }
    return "クエリが成功しました";
}

try {
    let authResult = authenticateUser("user", "wrongpassword");
    console.log(authResult);
    let dbResult = queryDatabase("");
    console.log(dbResult);
} catch (error) {
    if (error instanceof AuthenticationError) {
        console.error("認証エラー:", error.message);
    } else if (error instanceof DatabaseError) {
        console.error("データベースエラー:", error.message);
    } else {
        console.error("予期しないエラーが発生しました:", error.message);
    }
}

カスタムエラーを作成し適切にハンドリングすることで、エラーメッセージを明確にし、エラー発生時の対応をより効果的に行うことができます。これにより、コードの可読性とメンテナンス性が向上し、エラー処理が一貫して行われるようになります。

外部ライブラリの活用

JavaScriptでは、数値演算とエラー処理に関する外部ライブラリを活用することで、より高度な機能や効率的な開発が可能になります。ここでは、数値演算とエラー処理に役立ついくつかの外部ライブラリを紹介します。

数値演算に役立つライブラリ

math.js

math.jsは、包括的な数学ライブラリであり、基本的な数値演算から複雑な数式の評価、ユニット変換、統計計算など、多様な機能を提供します。

// math.jsのインストール
// npm install mathjs

const math = require('mathjs');

let result = math.sqrt(16);         // 平方根:4
let complex = math.complex(2, 3);   // 複素数:2 + 3i
let matrix = math.matrix([[1, 2], [3, 4]]);  // 行列
let det = math.det(matrix);         // 行列の行列式:-2

console.log(result);
console.log(complex);
console.log(matrix);
console.log(det);

big.js

big.jsは、高精度の浮動小数点演算をサポートするライブラリです。JavaScriptの浮動小数点演算の精度問題を回避するために使用されます。

// big.jsのインストール
// npm install big.js

const Big = require('big.js');

let a = new Big(0.1);
let b = new Big(0.2);
let sum = a.plus(b);   // 正確な0.3

console.log(sum.toString());  // 0.3

エラー処理に役立つライブラリ

bluebird

bluebirdは、高機能なPromiseライブラリで、詳細なエラーハンドリング機能を提供します。Promiseチェーンにおけるエラー処理を効率化できます。

// bluebirdのインストール
// npm install bluebird

const Promise = require('bluebird');

function asyncTask() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject(new Error("非同期タスクでエラーが発生しました"));
        }, 1000);
    });
}

asyncTask().catch(error => {
    console.error("エラー:", error.message);
});

winston

winstonは、強力なロギングライブラリで、エラーログをファイルやコンソール、その他のストレージに出力することができます。エラーハンドリングとデバッグに役立ちます。

// winstonのインストール
// npm install winston

const winston = require('winston');

const logger = winston.createLogger({
    level: 'error',
    format: winston.format.combine(
        winston.format.timestamp(),
        winston.format.json()
    ),
    transports: [
        new winston.transports.Console(),
        new winston.transports.File({ filename: 'error.log' })
    ]
});

try {
    throw new Error("例外が発生しました");
} catch (error) {
    logger.error(error.message, { stack: error.stack });
}

デバッグに役立つライブラリ

debug

debugライブラリは、簡単にデバッグログを出力するためのライブラリです。名前空間ごとにログを管理でき、開発中のデバッグに便利です。

// debugのインストール
// npm install debug

const debug = require('debug')('app');

function performTask() {
    debug('タスクが実行されました');
    // タスクの処理
}

performTask();

これらの外部ライブラリを活用することで、JavaScriptにおける数値演算の精度向上やエラー処理の効率化を図ることができます。適切なライブラリを選択し、プロジェクトに組み込むことで、開発の生産性とコードの品質を向上させることができます。

応用例と演習問題

JavaScriptの数値演算とエラー処理の理解を深めるために、実際の応用例と演習問題を紹介します。これにより、学んだ知識を実践的に活用できるようになります。

応用例:カスタム電卓アプリケーション

ここでは、JavaScriptの数値演算とエラー処理を活用したカスタム電卓アプリケーションの例を示します。この電卓は基本的な四則演算、平方根計算、およびエラー処理を含んでいます。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>カスタム電卓</title>
</head>
<body>
    <h1>カスタム電卓</h1>
    <input type="text" id="display" disabled>
    <div>
        <button onclick="appendNumber(7)">7</button>
        <button onclick="appendNumber(8)">8</button>
        <button onclick="appendNumber(9)">9</button>
        <button onclick="setOperation('/')">/</button>
    </div>
    <div>
        <button onclick="appendNumber(4)">4</button>
        <button onclick="appendNumber(5)">5</button>
        <button onclick="appendNumber(6)">6</button>
        <button onclick="setOperation('*')">*</button>
    </div>
    <div>
        <button onclick="appendNumber(1)">1</button>
        <button onclick="appendNumber(2)">2</button>
        <button onclick="appendNumber(3)">3</button>
        <button onclick="setOperation('-')">-</button>
    </div>
    <div>
        <button onclick="appendNumber(0)">0</button>
        <button onclick="calculate()">=</button>
        <button onclick="setOperation('+')">+</button>
        <button onclick="sqrt()">√</button>
    </div>
    <div>
        <button onclick="clearDisplay()">C</button>
    </div>
    <script>
        let display = document.getElementById('display');
        let currentInput = '';
        let currentOperation = '';
        let firstOperand = null;

        function appendNumber(number) {
            currentInput += number;
            display.value = currentInput;
        }

        function setOperation(operation) {
            if (currentInput === '') return;
            firstOperand = parseFloat(currentInput);
            currentOperation = operation;
            currentInput = '';
            display.value = '';
        }

        function calculate() {
            if (currentInput === '' || firstOperand === null) return;
            let secondOperand = parseFloat(currentInput);
            let result;
            try {
                switch (currentOperation) {
                    case '+':
                        result = firstOperand + secondOperand;
                        break;
                    case '-':
                        result = firstOperand - secondOperand;
                        break;
                    case '*':
                        result = firstOperand * secondOperand;
                        break;
                    case '/':
                        if (secondOperand === 0) throw new Error("ゼロ除算エラー");
                        result = firstOperand / secondOperand;
                        break;
                    default:
                        return;
                }
                display.value = result;
                currentInput = result.toString();
                firstOperand = null;
                currentOperation = '';
            } catch (error) {
                display.value = error.message;
            }
        }

        function sqrt() {
            if (currentInput === '') return;
            let value = parseFloat(currentInput);
            if (value < 0) {
                display.value = "無効な入力";
                return;
            }
            let result = Math.sqrt(value);
            display.value = result;
            currentInput = result.toString();
        }

        function clearDisplay() {
            display.value = '';
            currentInput = '';
            currentOperation = '';
            firstOperand = null;
        }
    </script>
</body>
</html>

この電卓アプリケーションは、ユーザー入力に対する基本的なエラーチェックを実装し、ゼロ除算や負の数の平方根計算などのエラーを処理します。

演習問題

  1. 問題1:二次方程式の解の計算
    二次方程式ax^2 + bx + c = 0の解を求める関数を作成してください。解が実数でない場合は、適切なエラーメッセージを表示するようにしてください。
   function solveQuadratic(a, b, c) {
       let discriminant = b * b - 4 * a * c;
       if (discriminant < 0) {
           throw new Error("実数解が存在しません");
       }
       let root1 = (-b + Math.sqrt(discriminant)) / (2 * a);
       let root2 = (-b - Math.sqrt(discriminant)) / (2 * a);
       return [root1, root2];
   }

   try {
       let roots = solveQuadratic(1, -3, 2);
       console.log("解:", roots);
   } catch (error) {
       console.error(error.message);
   }
  1. 問題2:高精度の数値計算
    big.jsを使用して、非常に大きな数値の計算を行う関数を作成してください。例えば、100桁の数の加算を行う関数を実装し、その結果を表示してください。
   const Big = require('big.js');

   function addLargeNumbers(num1, num2) {
       let bigNum1 = new Big(num1);
       let bigNum2 = new Big(num2);
       return bigNum1.plus(bigNum2).toString();
   }

   let result = addLargeNumbers('123456789012345678901234567890', '987654321098765432109876543210');
   console.log("結果:", result);  // 結果: 1111111110111111111011111111100
  1. 問題3:カスタムエラーを用いた入力バリデーション
    ユーザーの年齢を入力として受け取り、0から120の範囲外の場合にカスタムエラーをスローする関数を作成してください。
   class AgeValidationError extends Error {
       constructor(message) {
           super(message);
           this.name = "AgeValidationError";
       }
   }

   function validateUserAge(age) {
       if (age < 0 || age > 120) {
           throw new AgeValidationError("年齢は0から120の間である必要があります");
       }
       return age;
   }

   try {
       let age = validateUserAge(150);
       console.log("年齢:", age);
   } catch (error) {
       if (error instanceof AgeValidationError) {
           console.error("バリデーションエラー:", error.message);
       } else {
           console.error("予期しないエラー:", error.message);
       }
   }

これらの応用例と演習問題を通じて、JavaScriptの数値演算とエラー処理の理解を深め、実際のプロジェクトに応用するためのスキルを向上させましょう。

まとめ

本記事では、JavaScriptにおける数値演算とエラー処理について、基本から応用まで包括的に解説しました。JavaScriptの数値型の基本や基本的な数値演算、数学関数の活用方法、浮動小数点の精度問題に対する対策、基本的なエラー処理の方法、数値演算におけるエラーの種類とその原因、エラーの検出とデバッグ手法、カスタムエラーの作成、外部ライブラリの活用、そして実際の応用例と演習問題を通じて、実践的なスキルを身につけることができたかと思います。

数値演算とエラー処理は、JavaScriptプログラミングにおいて非常に重要な要素です。これらの知識と技術を活用して、より信頼性が高く、保守性の良いコードを作成することができます。引き続き学習と実践を重ね、さらにスキルを向上させていってください。

コメント

コメントする

目次