◆ご質問◆
グリッドのドメインが「double」の場合に、
小数値を入力すると誤差が生じるケースが存在します。
どのようにすれば誤差を生じさせず、表示することができるのでしょうか。
◆回答◆
小数以下の数値で誤差を生じさせない方法として、
2点挙げられます。
■1点目
RecordFieldのドメインにStringを設定し、
入力した値をそのまま表示させるようにし、
計算を行う際には値の小数を整数に変換した上で
計算するという方法です。
まず、プログラムで扱う小数点以下の最大桁数を決めます。
(下記のサンプルであれば、小数点以下3桁が最大桁数)
その桁数までが整数となるように
10のN乗を掛け、整数として計算を行い、
その結果を10のN乗で割ります。
これにより、浮動小数点数を介さずに計算を行い、
誤差の発生を抑止できます。
==============================================
{let number:double = 0}
{for i:int = 1 to 100000 do
||小数0.003を整数にするために1000倍する
set number = number + 0.003*1000
}
||上記で1000倍した分を元に戻す
{set number = number/1000}
{value (number asa int)}
==============================================
■2点目
RecordFieldのドメインにStringを設定し、
計算の時には、BigDecimalを使用するという方法です。
CurlではjavaでいうところのBigDecimalと類似した機能を扱うことができます。
BigDecimalでは任意の長さの10進数の表現と操作を行え、
浮動小数点数のように10進数から2進数に変換するという動作をしないため、
丸め誤差を生じさせずに計算を行う事ができます。
BigDecimalクラスは既存のCurlAPIではないため、
以下URLよりダウンロードする必要がございます。
http://www.curlap.com/curl/bigDecimalSample.zip
ダウンロードしたパッケージ(big-pkg.curl)をBigDecimalを
使用したいアプレットにインポートすることにより、
BigDecimalクラスを使用することができます。
(但し、big-pkg.curlの内容に関してサポートの範囲外になるため、
このパッケージに関するサポートは行いません。
あらかじめご了承下さい。)
詳細はサンプルをご参照ください。