2

指数数値1.11111117E+9を変換しようとしています。これは実際には10桁の数値「1111111111」です。この指数数値をdecimal.TryParseメソッドを使用して変換しようとすると、最後の3桁がゼロになり、数値が「111111000」になります。これは、任意の10桁の数字で発生しています。

   decimal amount;
   decimal.TryParse("1.11111117E+9", NumberStyles.Any, null, out amount);

これは奇妙ですが、ここで何が問題なのか理解できません。誰かがこれの何が問題なのか教えてもらえますか?

編集: 誤解を招く質問でごめんなさい。ヘンリックが彼の答えで述べたように、まさに私が直面していることです。

float f = 1111111111;
string s = f.ToString();
decimal amount;
decimal.TryParse(s, NumberStyles.Any, null, out amount);

これは常に1111111000を返しますか?正しい値を取得するには、この問題に対処するにはどうすればよいですか?floatデータ型からDoubleまたはDecimalに変更しますか?それとも解決策ですか?

4

4 に答える 4

7

フロート値をラウンドトリップするのは簡単です...

float f = 1111111111;
string s = f.ToString("r"); // r = roundtrip
float g = float.Parse(s);

fこれで同じになりますg...しかし、それはどちらかの値が正確に1111111111であるという意味ではありません...その値はfloatとして表すことができないためです。フロートとして正確に表現できる最も近い値は1111111168です...これが、科学的表現の最後に7が表示される理由です。

float基本的に、そもそもこれに使用するべきではありません。System.Singleのドキュメントから:

デフォルトでは、単一の値には小数点以下7桁の精度しか含まれていませんが、内部では最大9桁が維持されます。

したがって、10桁の数字を保存しようとして、それが正確に保存されることを期待するのは、ばか者の用事です。

使用する必要があるかどうかを判断するのは難しいですdouble-decimalそれはあなたが実際に保存しようとしている値に依存します。それが体重や身長のような「自然な」値であるなら、私はに行きdoubleます。価格のような「人間的な」価値であれば、私はを使用しますdecimal

于 2011-01-18T12:58:55.097 に答える
4

これ

decimal amount;
decimal.TryParse("1.11111117E+9", NumberStyles.Any, 
    CultureInfo.InvariantCulture, out amount);

予想通り、セットの量は1111111170Mになります。

CultureInfo.InvariantCultureに注意してください。これは、ローカル設定に依存しません。

更新:実際のコードは次のようになっていると思います。

float f = 1111111111;
string s = f.ToString();
decimal amount;
decimal.TryParse(s, NumberStyles.Any, null, out amount);

fは1.11111117e+9としてデバッガーに表示され、sは1.111111e + 9、金額は1111111000Mです。このすべての理由は、floatの精度が限られているためです。

于 2011-01-18T11:48:20.570 に答える
2

これを試してみてください、それは私にとってよりうまくいきます

 decimal dec = Decimal.Parse("1.11111117E+9", System.Globalization.NumberStyles.Any);
于 2013-08-21T06:44:23.473 に答える
0

doubleではなく、解析する必要がありdecimalます。科学的記数法には場所がありませんdecimal

更新:正確な整数値は1111111170です。111111111あるべきものの約10分の1ではありません。

于 2011-01-18T11:37:39.783 に答える