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

外部連携の後処理で任意のエラーメッセージを表示する

このCookbookでは、外部連携の後処理で任意のエラーメッセージを表示する方法を紹介します。 この方法を活用することにより、外部連携の後処理ででエラーが発生した場合、利用者に内容を通知することができ …

no image

承認ノードの画面アイテムに任意の初期値を設定する方法

このCookBookでは、BISワークフローにおいて、承認ノードの画面アイテムに任意の初期値を設定する方法を紹介します。 画面アイテムに任意の初期値を設定する方法としては、画面アイテムプロパティである …

no image

imuiListTableで行の背景色を動的に変更する方法

このCookBookでは、imuiListTableで行の背景色を動的に変更する方法について紹介しています。 imuiListTableについての詳細はAPIドキュメントを参照してください。 [imu …

BloomMakerとLogicDesignerでWorkflowコンテンツを作成する

このCookBookでは、BloomMakerとLogicDesignerを利用してWorkflowのコンテンツを作成する方法を紹介します。 2019 Winter(8.0.24)で、以下の機能をリリ …

IM-BloomMaker フォーム部品(Bulma)のグループ化と結合の使い方

このCookBookでは、intra-mart Accel Platform 2020 Summer から利用可能になった コンテンツ種別「Bulma」の「フォーム部品(Bulma)」を使用したグルー …