2

私は次のコードを使用していますが、いくつかの不可解な状況では、追加の結果が想定どおりではありません。

double _west = 9.482935905456543;
double _off = 0.00000093248155508263153;
double _lon = _west + _off;

// check for the expected result
Debug.Assert(_lon == 9.4829368379380981);
// sometimes i get 9.48293685913086 for _lon (which is wrong)

アプリケーション内でいくつかのネイティブ DLL を使用していますが、一部の DLL がこの「誤算」の原因であると思われますが、どの DLL かを特定する必要があります。私の問題の根本を理解する方法を誰かに教えてもらえますか?

4

5 に答える 5

10

double は完全に正確ではありません。代わりに decimal を使用してみてください

double と float を decimal よりも使用する利点はパフォーマンスです

于 2009-07-28T12:01:00.147 に答える
2

最初はこれは丸めエラーだと思っていましたが、実際には間違っているのはあなたの主張です。任意の丸めを行わずに、計算の結果全体を追加してみてください。

これを試して:

using System;

class Program
{
    static void Main()
    {
        double _west = 9.482935905456543;
        double _off = 0.00000093248155508263153;
        double _lon = _west + _off;

        // check for the expected result
        Console.WriteLine(_lon == 9.48293683793809808263153);       
    }
}

将来的には、および型 System.Decimalに通常関連する丸め誤差を回避する必要がある場合に使用するのが最善です。System.SingleSystem.Double

そうは言っても、ここではそうではありません。特定のポイントで数値を任意に丸めると、型も同じポイントで丸められると想定されますが、これはどのように機能するかではありません。浮動小数点数は最大表現容量まで格納され、そのしきい値に達した場合にのみ丸めが行われます。

于 2009-07-28T12:01:05.763 に答える
1

問題は、Double の精度が 15 ~ 16 桁しかないことです (この例では、さらに精度が必要なようです)。Decimal の精度は 28 ~ 29 です。Double と Decimal の間でどのように変換していますか?

于 2009-07-28T12:09:59.677 に答える
0

丸めと精度の問題に悩まされています。これを参照してください。10 進数が役立つ場合があります。変換と丸めの詳細については、こちらを参照してください。

MSDN から:

float または double を 10 進数に変換すると、ソース値は 10 進数表現に変換され、必要に応じて小数点以下 28 桁目以降の最も近い数値に丸められます。ソース値の値に応じて、次のいずれかの結果が発生する可能性があります。

ソース値が小さすぎて 10 進数で表せない場合、結果はゼロになります。

ソース値が NaN (数値ではない)、無限大、または大きすぎて 10 進数として表せない場合、OverflowException がスローされます。

于 2009-07-28T12:06:01.353 に答える
0

10 進数システムのすべての浮動小数点数を 2 進数システムの浮動小数点数で正確に表すことはできません。これは、10 進数が「小さい」かどうかに直接関係することさえありません。一部の数値は基数に「適合」しません。 2 きれいに。

より長いビット幅を使用すると、ほとんどの場合に役立ちますが、常にそうとは限りません。

Decimal(128 ビット浮動小数点) 精度で定数を指定するには、次の宣言を使用します。

decimal _west = 9.482935905456543m;
decimal _off = 0.00000093248155508263153m;
decimal _lon = _west + _off;
于 2009-07-28T12:10:34.463 に答える