解説

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

使用方法

通常の演算結果


console.log( 66.9 * 100 );

// 結果
6690.000000000001

本関数の演算結果


console.log( Math.multiplication( 66.9, 100 ) );

// 結果
6690

パラメタ

vol1
乗算対象数値
vol2
乗算数値

戻り値

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

コード


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


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

	Example:
		console.log( Math.multiplication( 123, 100 ) );
		console.log( Math.multiplication( 0.00000000123, 100 ) );
		console.log( Math.multiplication( 1.23e-9, 100 ) );
		
	作成履歴
		2017/02/09	新規作成(浅野 利博)
--------------------------------------------------------------------------------------------------------------*/
Math.multiplication = 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 );

	// 小数以下桁数の合計を計算
	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 decimal_length = decimal_length1 * decimal_length2;
	if( decimal_length <= 0 )
	{
		decimal_length = 1;
	}

	// 小数点を取り除く
	val_str1 = parseFloat( val_str1.replace( '.', '' ) );
	val_str2 = parseFloat( val_str2.replace( '.', '' ) );

	// 掛け算を行い、小数点の桁数decimal_lengthの数だけ除算する
	return val_str1 * val_str2 / decimal_length;
}

必須要素

なし。

注意事項

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

更新履歴

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.