3

私の c# コンソール アプリケーションでは、double 変数を文字列型に変換したいと考えています。ただし、結果の文字列変数には、小数点の左側に少なくとも 3 桁、小数点の右側に 1 桁が必要です。例: 3.4569 は「003.4」に変換する必要があります

上記の例では機能しますが、次の変換では間違った結果がスローされます。

 double Num = Math.Pow((3 + Math.Sqrt(5)), N); //6578336356630531.0 for N=22
 string StringNum = Num .ToString("000.0");

その結果..

 StringNum ="6578336356630530.0";

しかし、それは..

 StringNum ="6578336356630531.0";

これらのタイプの数値の正確な文字列値を取得するにはどうすればよいですか??

 //decimal Num=Convert.ToDecimal (Math.Pow((3 + Math.Sqrt(5)), N));
 //this conversion also looses original value

ありがとう..

4

6 に答える 6

3

問題は、保存している値正確6578336356630531です。6578336356630530 に近い値はありませんdouble。したがって、出力は実行時に存在するデータに対して正しいです。

ドキュメントから:

また、すべての浮動小数点数には有効桁数の制限があり、これによって、浮動小数点値がどれだけ正確に実数に近似するかが決まります。Double 値の精度は最大 15 桁ですが、内部では最大 17 桁が維持されます。

あなたは16桁について口論しています。

any の正確な値を確認できる便利なクラスがあります。double

それ以上の精度が必要な場合は、decimal代わりに を使用してdoubleください。範囲は狭いが精度は高いことに注意しdecimalてください。

于 2013-04-02T16:06:53.637 に答える
0

倍精度での丸めなしの最大整数は 2^53 - 1 で、これは約 9e15 ですが、6e15 であり、貴重に表現される可能性がありますが、必ずしもそうとは限りません。あなたは不運に見舞われました (非常に多くの場合、不運のタイプです。それに対処してください)。これらの驚きを避けたい場合は、C# で decimal 型を使用する必要があります。

于 2013-04-02T16:13:50.670 に答える
0

decimal代わりに使用するとdouble、すべて問題ありません。

decimal Num = 6578336356630531.0m;
string StringNum = Num.ToString("000.0");

この問題は、double 値の表現と精度に関連しています。

于 2013-04-02T16:06:46.907 に答える
0

doubleその量の精度を保存することはできません。decimalそれが必要な動作である場合は、 a を使用します。

于 2013-04-02T16:06:50.470 に答える