CookBook

IM-BloomMaker カスタムスクリプトの小数の計算で誤差を出さない方法

投稿日:

このCookBookでは、IM-BloomMaker のアクションアイテム「カスタムスクリプトを実行する」で小数の計算を行う時に誤差を出さない方法について紹介しています。
カスタムスクリプトの使い方については以下の CookBook を参照してください。

IM-BloomMaker カスタムスクリプトの使い方と$variableからの取得・代入の方法

目次

  1. IM-BloomMaker カスタムスクリプトの小数の計算で誤差を出さない方法
  2. 高精度小数を扱う型
  3. Fraction クラスで使える関数

1. IM-BloomMaker カスタムスクリプトの小数の計算で誤差を出さない方法

例えば、カスタムスクリプトで「0.1 + 0.2」や「1 - 0.9」を計算すると誤差が出てしまいます。

カスタムスクリプトでは、高精度小数を Fraction クラスで扱うことで誤差を出さずに小数の計算が可能です。
上記の例の「0.1 + 0.2」と「1 - 0.9」を正しく計算するには、以下のように記述します。

2. 高精度小数を扱う型

Fraction は、IFraction インタフェースを持つ IM-BloomMaker 独自のクラスです。
IM-BloomMaker のカスタムスクリプトで高精度小数を扱うときは Fraction クラスを利用できます。
Fraction が扱える最大数値と最小数値は number 型と同一です。
BigDecimal ではないため、非常に大きい数値や限りなく 0 に近い数値は、number 同様に取り扱えません。

コンストラクタの引数には以下のいずれかを指定してください。

  • 数値
  • 文字列
  • 分子(第一引数)・分母(第二引数)

IFraction インタフェースは以下のプロパティを持ちます。プロパティは全て読み取り専用です。

プロパティ 説明
numerator 分子
denominator 分母
plus 正の数かどうか
zero ゼロかどうか
minus 負の数かどうか
divisible 割り切れるかどうか

3. Fraction クラスで使える関数

Fraction クラスの値を使って計算を行う場合は、IFraction インタフェースに定義されている演算用の関数を使用します。
以下は、利用できる関数の一覧です。

  • toString()
    オブジェクトが持つ値を文字列型に変換して返却します。割り切れない数の場合、分数表記で返却されます。
    例:

  • toNumber()
    オブジェクトが持つ値を数値型に変換して返却します。桁落ちにより精度が落ちるので注意してください。
    例:

  • clone()
    オブジェクトのインスタンスを複製します。
    例:

  • equals()
    関数の引数に与えられた Fraction オブジェクトの値と一致するか判定します。
    例:

  • compare()
    関数の引数に与えられた Fraction オブジェクトの値との差分比較を行います。
    例:

  • add()
    関数の引数に与えられた数値を加算して返却します。
    第一引数に分子、または、Fraction オブジェクトを指定し、第二引数に分母を指定してください。
    第二引数が省略された場合は 1 が使用されます。
    例:

  • sub()
    関数の引数に与えられた数値を減算して返却します。
    第一引数に分子、または、Fraction オブジェクトを指定し、第二引数に分母を指定してください。
    第二引数が省略された場合は 1 が使用されます。
    例:

  • mul()
    関数の引数に与えられた数値を乗算して返却します。
    第一引数に分子、または、Fraction オブジェクトを指定し、第二引数に分母を指定してください。
    第二引数が省略された場合は 1 が使用されます。
    例:

  • div()
    関数の引数に与えられた数値で除算した結果を返却します。
    第一引数に分子、または、Fraction オブジェクトを指定し、第二引数に分母を指定してください。
    第二引数が省略された場合は 1 が使用されます。
    例:

  • mod()
    関数の引数に与えられた数値で除算した余りを返却します。
    第一引数に分子、または、Fraction オブジェクトを指定し、第二引数に分母を指定してください。
    第二引数が省略された場合は 1 が使用されます。
    例:

  • abs()
    オブジェクトが持つ値の絶対値を返却します。
    例:

  • floor()
    オブジェクトが持つ値を、小数点以下を切り捨てて返却します。
    例:

  • round()
    オブジェクトが持つ値を、小数点以下を四捨五入して返却します。
    例:

  • ceil()
    オブジェクトが持つ値を、小数点以下を繰り上げて返却します。
    例:

-CookBook
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

BISやFormaのテーブルにCSVファイルからのインポート・エクスポートを行うには

このCookbookでは、明細テーブルやグリッドテーブルとCSVファイルを連携する方法を紹介します。 この方法を活用することにより、明細テーブルやグリッドテーブルへの入力の手間を軽減できます。 完成イ …

no image

グリッドテーブルの列タイプ「カスタム」を利用した場合にマルチセレクトがトグルされないようにする方法

このCookBookでは、グリッドテーブルの列タイプ「カスタム」を利用した場合に、マルチセレクトがトグルされないようにする方法を説明します。 グリッドテーブルでは、行内で参照表示となっている部分をクリ …

no image

ジョブを作成して定期実行する

このCookBookでは、以下の開発モデルでジョブを作成する方法と、作成したジョブを指定した時刻に定期実行する方法を紹介します。 ・スクリプト開発モデル ・JavaEE開発モデル いずれのモデルでもジ …

no image

IM-BloomMaker IE で画面を開くと「Internet Explorer は対応していません。」と表示するアプリケーションの作成方法

この CookBook では、 IE で画面を開くとダイアログで「Internet Explorer は対応していません。」と表示するアプリケーションを作成します。 Accel Platform 20 …

no image

スクリプト開発モデルで作成した1つのページソースを複数の画面で利用する

このCookBookでは、任意のスクリプト開発モデルプログラムをコールして部分ページソース挿入を行う方法を紹介します。 部分ページソース挿入は<imart type=”include”>タ …