浮動小数点型の計算精度補正

数式計算でコンピューターの浮動小数点型の特徴として、計算結果に一定の誤差が出る場合があります。 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-100
0.1 + 0.2 == 0.3FalseTrue

備考

FormulaExtension.FormulaCalculationEplison はグローバルの値で、ReoGridのすべてのインスタンスが共有で利用しています。初めてのReoGridのワークシートを初期化する前にこの値を変更してください。

この値を変更すると、その後のタイミングで数式計算を行う際に反映されます。変更る場合必要に応じて Worksheet.Recalculate() を呼び出してください。