解説

指数形式の浮動小数点にも対応した正しい減算を行う関数。
通常の四則演算では正しい結果にならない減算にも対応している。
更新日:2017年2月10日

使用方法

通常の演算結果


console.log( 0.1 - 0.3 );

// 結果
-0.19999999999999998

本関数の演算結果


console.log( Math.subtract( 0.1, 0.3 ) );

// 結果
-0.2

パラメタ

vol1 … あらゆる数値
引かれる数値
vol2 … あらゆる数値
引く数値

戻り値

数値
「val1 – val2」 の計算結果
引数が数値でない場合には「NaN」が返される。

コード


重要下記コードには依存関係が存在するため、実行するには、上記ライブラリをダウンロードして使用する必要がある。
減算関数


/*--------------------------------------------------------------------------------------------------------------
減算関数
	指数形式の浮動小数点にも対応した正しい減算を行う関数。
	
	引数
		val1	... 引かれる数値
		val2	... 引く数値
	
	戻り値
		「val1 - val2」の計算結果。
		引数が数値でない場合には「NaN」が返される。

	Example:
		console.log( 0.1 - 0.3 );
		console.log( Math.subtract( 0.1, 0.3 ) );
		
	作成履歴
		2017/02/08	新規作成(浅野 利博)
		2017/02/09	NaNはtypeofでnumber扱いになるため修正。(浅野 利博)
--------------------------------------------------------------------------------------------------------------*/
Math.subtract = function( val1, val2 )
{
	// 引数チェック
	if(
		( typeof val1 !== 'number' )
		||
		( typeof val2 !== 'number' )
		||
		isNaN( val1 )
		||
		isNaN( val2 )
	)
	{
		return NaN;
	}
	
	// 指定された引数の数値を小数点表記の数値文字列に変換する。
	var val_str1 = Math.toString( val1 );
	var val_str2 = Math.toString( val2 );

	// 小数点に応じた桁数を求める
	// 整数の場合には「1」となる。
	var decimal_length1 = val_str1.split( '.' );
	if( decimal_length1[1] )
	{
		decimal_length1 = Math.pow( 10, decimal_length1[1].length );
	} else {
		decimal_length1 = 1;
	}

	var decimal_length2 = val_str2.split( '.' );
	if( decimal_length2[1] )
	{
		decimal_length2 = Math.pow( 10, decimal_length2[1].length );
	} else {
		decimal_length2 = 1;
	}

	// 最大の桁数を求める
	var max_decimal_length = Math.max( decimal_length1, decimal_length2 );

	// 整数として引き算を行い、小数点を戻す。
	return( ( ( val1 * max_decimal_length ) - ( val2 * max_decimal_length ) ) / max_decimal_length );
}

必須要素

なし。

注意事項

  • 当たり前ではあるが、扱える数値の範囲は、
    Number.MAX_VALUE 以下で、Number.MIN_VALUE 以上である数値に限られる。

更新履歴

2017/02/08 … 浅野 利博
新規作成。
2017/02/09 … 浅野 利博
コードの引数チェックを修正。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.