8

次の簡単なコードがあるとしましょう

        string number = "93389.429999999993";
        double numberAsDouble = Convert.ToDouble(number);
        Console.WriteLine(numberAsDouble);

その後、変換numberAsDouble変数の値は 93389.43 になります。この変数を四捨五入せずにそのまま完全な数に保つにはどうすればよいですか? Convert.ToDecimal同じように動作しないことがわかりましたが、値を2倍にする必要があります。

-------小さな更新---------------------

上記のコードの 2 行目にブレークポイントを配置すると、コンソールに表示される前に numberAsDouble 変数が丸められた値 93389.43 を持つことが示されます。

4

7 に答える 7

11

93389.42999999999364 ビット浮動小数点数として正確に表すことはできません。Adoubleは 15 桁または 16 桁しか保持できませんが、あなたは 17 桁です。そのレベルの精度が必要な場合は、decimal代わりに a を使用してください。

(ダブルとして必要だと言っているのは知っていますが、理由を説明できれば、別の解決策があるかもしれません)

于 2013-01-15T17:51:21.630 に答える
6

これは予期される動作です。

double は、すべての数値を正確に表すことはできません。これは文字列変換とは関係ありません。

自分で確認できます:

Console.WriteLine(93389.429999999993);

これは印刷されます93389.43

次の例もこれを示しています。

Console.WriteLine(93389.429999999993 == 93389.43);

これは印刷されTrueます。

于 2013-01-15T17:47:52.323 に答える
4

ここでは 2 つの変換が行われていることに注意してください。最初に文字列を double に変換し、次にその double を文字列に変換して表示します。

doubleまた、 a の精度が無限ではないことも考慮する必要があります。文字列によっては、double には格納する容量がないため、一部のデータが失われる可能性があります。

double に変換する場合、必要以上に「丸める」ことはありません。double の機能を考慮して、指定された数値に最も近い double を作成します。その double を文字列に変換すると、一部の情報が保持されない可能性が高くなります。

于 2013-01-15T17:48:37.797 に答える
3

以下を参照してください(特にMichael Borgwardtの回答の最初の部分):

10進数と2倍!- どれをいつ使用すればよいですか?

double は、変換しようとしている数値に応じて常に精度を維持するとは限りません

正確にする必要がある場合は、使用する必要がありますdecimal

于 2013-01-15T17:50:22.230 に答える
0

このdouble型は 64 ビットの有限精度であるため、numberAsDouble 変数に実数を格納すると丸め誤差が発生します。

あなたの例でうまくいく解決策は、decimal代わりに128ビットの精度を持つ型を使用することです。しかし、わずかな違いでも同様の問題が発生します。

任意の大きな数値の場合System.Numerics.BigInteger、.NET Framework 4.0 のオブジェクトは整数の任意の精度をサポートします。ただし、任意の大きな実数を使用するには、サードパーティのライブラリが必要になります。

于 2013-01-15T18:04:02.773 に答える
0

倍精度を超えないように、必要な桁数に小数点以下を切り捨てることができます。

たとえば、これは小数点以下 5 桁に切り捨てられ、93389.42999 になります。100000 を必要な値に置き換えるだけです

string number = "93389.429999999993";
decimal numberAsDecimal = Convert.ToDecimal(number);
var numberAsDouble = ((double)((long)(numberAsDecimal * 100000.0m))) / 100000.0;
于 2013-01-15T18:07:50.347 に答える
0

doubleこれは、が格納できる精度の制限です。3389.429999999993代わりに変換を試みることで、これを自分で確認できます。

于 2013-01-15T17:50:24.140 に答える