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

Web サーバで Cookie に SameSite=None; Secure 属性を追加する方法

ブラウザの仕様変更により、クロスドメインアクセスにおける Cookie の扱いに変更がありました。 Google Chrome では バージョン 80 以降、SameSite 属性が宣言されていない …

標準の画面アイテムを利用して「先頭へ戻る」ボタンを実現する

このCookBookでは、標準の画面アイテムを利用して「先頭へ戻る」ボタンを実現する方法について紹介しています。 本稿では、表示する項目が多く縦長い画面で下へスクロールすると右下に「先頭へ戻る」ボタン …

no image

e Builder から Payara を起動する方法

この CookBook では、e Builder から Payara を起動する方法について紹介しています。 レシピ External Tools を表示します。 Program を追加します。 Pr …

IM-BloomMaker グラフエレメントの使い方(基本編)

このCookBookでは、intra-mart Accel Platform 2019 Winter から利用可能になった IM-BloomMaker のグラフエレメントの使い方について紹介しています …

no image

ノード毎に入力モード(表示モード)変換を切り替える方法

このCookBookでは、BISワークフローにおいて、ノード毎に各アイテムの入力(表示)モードを切り替える方法を紹介します。 ノード毎に別画面を作成する方法もありますが、本稿ではアクション設定を利用し …