関数/メソッド

Q6
Roundup関数/Rounddown関数で意図した数値に丸められない

A6
[解決方法]
原因としては、以下が考えられます。

<1>浮動小数点による誤差

Biz/Browserで数値を扱う際には、デフォルトではNumber型で扱います。
Number型では実数を表すために浮動小数点型を利用していますが、浮動小数点型では、
メモリに格納した値に誤差を含むことがあります。

浮動小数点型による誤差について、詳しくは以下をご参照ください。
Tips集 > NOTE! > Biz/Browserでの小数点演算

(例)  roundup(9.9/3.3) → 4
  本来3で割り切れるはずですが、浮動小数点型の誤差により 9.9/3.3 = 3.000000...1
という計算結果がメモリに格納されます。
これを切り上げるため4となってしまいます。

浮動小数点の誤差を回避するためには、オブジェクトをFixed型で定義します。

ただし、Roundup/Rounddown関数などの算術関数では、Numberを引数として処理
するため、Fixedとして定義されていても、関数内ではNumberとして扱われます。
roundup(9.9F/3.3F)のように記述するか、バージョンがv4以降であればFixed.Roundupや
Fixed.Rounddownなどのメソッドを利用してください。


<2>関数とメソッドの丸め方向の違い

負の値を丸める場合、算術関数のRoundup/Rounddown関数と、Fixedクラスの
Roundup/Rounddownメソッドでは丸める方向に違いがあります。

算術関数のRoundup/Rounddown関数

                      ← Rounddown(0.5) = 0  |  Roundup(0.5) = 1 →
  0.5を丸める場合:  0  0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9  1
 -0.5を丸める場合: -1 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1  0
                     ← Rounddown(-0.5) = -1 |  Roundup(-0.5) = 0 →

 切り上げは正方向に、切り下げは負方向に行われます。

FixedクラスのRoundup/Rounddownメソッド

                     ← Rounddown(0.5F) = 0  |  Roundup(0.5F) = 1 →
  0.5を丸める場合:  0  0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9  1
 -0.5を丸める場合: -1 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1  0
                     ← Roundup(-0.5F) = -1  |  Rounddown(-0.5F) = 0 →

 切り上げ、切り下げ共に絶対値で行われます。


管理番号:FnM_001
  Biz-Collections Bizの宝箱 トップへ
  Biz/Browser・Biz/Designer TIPS集 トップへ