浮動小数点型の計算精度補正
数式計算でコンピューターの浮動小数点型の特徴として、計算結果に一定の誤差が出る場合があります。 ReoGridではこの問題を解消するために、2種類の浮動小数点型の計算補正機能を提供します。
オプションの設定 Worksheet.Options.FormulaCalculationPrecision にて設定できます。
public enum FormulaCalculationPrecision
{
/// <summary>
/// Default. Do not perform precision correction, the best performance during formula calculation.
/// </summary>
NoPrecisionCorrection = 0,
/// <summary>
/// Perform equalution comparison using predefined Eplison value, <code>WorksheetOptions.FormulaCalculationEplison</code>, default is 0.000001.
/// </summary>
LowPrecision = 1,
/// <summary>
/// Perform high precision correction. ReoGrid will dynamically calculate the high precision epsilon from the value to be compared.
/// </summary>
HighPrecision = 2,
}
| 項目 | 説明 | 備考 |
|---|---|---|
| NoPrecisionCorrection | 精度補正を行わない | .NETの浮動小数点型の計算に従う |
| LowPrecision | 低精度補正(計算速度優先)、デフォルト設定、推奨 | この設定は FormulaExtension.FormulaCalculationEplison であらかじめ定義した Epsilon 値で補正計算を行う。この値はアプリから変更可能。デフォルトは 1E-06 |
| HighPrecision | 高精度補正(計算精度優先) | この設定の場合はReoGridは補正対象となる値から動的にEpsilonを計算し、その計算したEpsilon値で補正計算を行う。FormulaExtension.FormulaCalculationEplison で定義した値は利用されない |
設定のサンプルコード
// 補正計算をOnに
sheet.Options.FormulaCalculationPrecision = FormulaCalculationPrecision.LowPrecision;
// Eplison を変更(LowPrecisionの場合のみこの値は利用される)
FormulaExtension.FormulaCalculationEplison = 0.0000001f;
補正計算例
| 数式 | 補正前 | 補正後 |
|---|---|---|
| 924081.39 + 3604900.09 - 759790.51 - 3769190.97 | -4.656612873077393E-10 | 0 |
| 0.1 + 0.2 == 0.3 | False | True |
備考
FormulaExtension.FormulaCalculationEplison はグローバルの値で、ReoGridのすべてのインスタンスが共有で利用しています。初めてのReoGridのワークシートを初期化する前にこの値を変更してください。
この値を変更すると、その後のタイミングで数式計算を行う際に反映されます。変更る場合必要に応じて Worksheet.Recalculate() を呼び出してください。