C((zhi)double変数を文字列にフォーマットし、小数点以下のすべての桁数を残します。

4077 ワード

原文:
http://www.crifan.com/csharp_フォーマットドビルto_stringwith_dicimal_ポイント/
【問題】
C((zhi)では、1343392590725.6758などのdouble変数値が得られています。その後、文字列に変換し、小数点以下の4桁をすべて保持したいですが、結果は以下の通りです。

1
2
3
4
5
6
7
8
9
10
11privatevoiddoubleToStringTest(){    doublecurMilliSecDouble = 1343392590725.6758;    //double curMilliSecDouble = crl.getCurTimeInMillisec();        //1343392590725.6758    stringcurMilliSecStrF = curMilliSecDouble.ToString("%.4f");    //%1343404742649074f    stringcurMilliSecStrG = curMilliSecDouble.ToString("G");       //1343404742649.07    stringcurMilliSecStrG4 = curMilliSecDouble.ToString("G4");     //1.343E+12    stringcurMilliSecStr00 = curMilliSecDouble.ToString("0.0000"); //1343404742649.0700    stringcurMilliSecStrF6 = curMilliSecDouble.ToString("f6");     //1343392590725.680000    stringcurMilliSecStr = curMilliSecDouble.ToString();           //1343404742649.07}常に4桁の小数を表示できません。
【解決過程】
1.Double.ToStringを見つけましたが、何の助けもありません。
2.せっかくマイクロソフトの公式教程を見つけました。標準数値書式の文字列は上記のテストコードを書きましたが、やはり小数点以下の2桁だけを出力しました。
3.ネット上でもこのような問題がありました。
Double.ToStringはどうやって小数点以下の精度を指定しますか?
しかし、誰も説明してくれませんでした。
4.この説明:C〓Double toStringは小数点以下の方法を保留しても私の必要ではない。
5.ここを参考にしてMath.Roundを使います。

1string roundedDoubleStr = Math.Round(curMilliSecDouble, 4).ToString();結果の出力はまだ1343392590725.68で、希望の1343392590725.6758ではありません。
6.ここを参考にして試してみました。

1string curMilliSecStrXing = curMilliSecDouble.ToString("#.####"); //1343392590725.68結果はそのままです。
7.後から参考:【解決済み】C((zhi)里doubble変数のToString()は自動的に2位を切り取りますが、どのような状況なのか、そのヒントを見ると、まったく小数点以下の問題ではなく、全体の桁数の問題です。
その後、正しいことがわかる:1343392590725.6758
全部で17桁の数字で、整数部分は13桁で、小数部分は4桁です。
それから、わざと一人足りない状況をテストします。
3433925907125.6758
このdoubleの値は16桁の数字で、整数の部分は12桁で、小数の部分は4桁です。
そしてテストの結果はもう一桁の小数を出力することができます。

1
2
3
4double less1BitDouble = 343392590725.6758;string less1BitDoubleStrG = less1BitDouble.ToString("G");   //"343392590725.676"string less1BitDoubleStrF = less1BitDouble.ToString("F");   //"343392590725.68"string less1BitDoubleStrF6 = less1BitDouble.ToString("F6"); //"343392590725.676000"その後、もっと小さいdoubleの値を試してみました。

1
2
3
4double smallValDouble = 1234.567890;string smallValDoubleStrG = smallValDouble.ToString("G");   //1234.56789string smallValDoubleStrF = smallValDouble.ToString("F");   //1234.57string smallValDoubleStrF6 = smallValDouble.ToString("F6"); //1234.567890結果は明らかであり、所望の正常出力をインストールすることができる。
F:デフォルトは2桁の小数点です。
F 6:小数点以下6桁を出力し、足りなければ0で補完します。
G:デフォルトの出力元は、小数点以下の桁数を保持します。
 
【まとめ】
ここでは1343392590725.6758のようなdouble値がToStering形式で出力されても、パラメータがFであろうとGであろうと、FNであろうと、GNであろうと、結果はまだ2桁の小数点です。その原因はここでdouble値が大きすぎて、全体の桁数はちょうど13+4=17で、内部は15桁しか保存できません。いつも2桁しか出力できません。ちょうどFパラメータのデフォルト出力と2桁が一致していますので、FやGなどのパラメータは実際には有効ではないと思います。