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

AWS 上に Accel Platform を構築する方法

  この CookBook では、AWS の仮想マシン機能(Amazon EC2)を用いて、スタンドアローンで intra-mart Accel Platform を構築する方法について紹介 …

no image

IM-Workflowの色々なコンテンツ画面へ遷移するURL

このCookbookでは、IM-Workflowの色々なコンテンツ画面へ遷移するURLをご紹介いたします。 独自で作成した画面やViewCreator、BloomMakerなど、IM-Workflow …

no image

最初に表示するページを指定する方法

このCookBookでは、最初に表示するページを指定する方法について紹介しています。 BloomMakerのデザイン編集画面でコンテナページを追加すると、プレビュー画面やアプリケーション画面では1つ目 …

no image

外部システムから IM-Notice に通知を送る方法

この CookBook では、intra-mart Accel Platform 8.0.14 2016 Summer から導入された IM-Notice への通知タスクを利用して、外部システムから …

IM-BloomMaker アクション「エレメントの位置へ遷移する」の使い方

このCookBookでは、intra-mart Accel Platform 2024 Autumnでリリースしたアクション「エレメントの位置へ遷移する」の使い方について紹介しています。 完成イメージ …