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
11
【解決過程】
1.Double.ToStringを見つけましたが、何の助けもありません。
2.せっかくマイクロソフトの公式教程を見つけました。標準数値書式の文字列は上記のテストコードを書きましたが、やはり小数点以下の2桁だけを出力しました。
3.ネット上でもこのような問題がありました。
Double.ToStringはどうやって小数点以下の精度を指定しますか?
しかし、誰も説明してくれませんでした。
4.この説明:C〓Double toStringは小数点以下の方法を保留しても私の必要ではない。
5.ここを参考にしてMath.Roundを使います。
?
1
6.ここを参考にして試してみました。
?
1
7.後から参考:【解決済み】C((zhi)里doubble変数のToString()は自動的に2位を切り取りますが、どのような状況なのか、そのヒントを見ると、まったく小数点以下の問題ではなく、全体の桁数の問題です。
その後、正しいことがわかる:1343392590725.6758
全部で17桁の数字で、整数部分は13桁で、小数部分は4桁です。
それから、わざと一人足りない状況をテストします。
3433925907125.6758
このdoubleの値は16桁の数字で、整数の部分は12桁で、小数の部分は4桁です。
そしてテストの結果はもう一桁の小数を出力することができます。
?
1
2
3
4
?
1
2
3
4
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などのパラメータは実際には有効ではないと思います。
http://www.crifan.com/csharp_フォーマットドビルto_stringwith_dicimal_ポイント/
【問題】
C((zhi)では、1343392590725.6758などのdouble変数値が得られています。その後、文字列に変換し、小数点以下の4桁をすべて保持したいですが、結果は以下の通りです。
?
1
2
3
4
5
6
7
8
9
10
11
private
void
doubleToStringTest()
{
double
curMilliSecDouble = 1343392590725.6758;
//double curMilliSecDouble = crl.getCurTimeInMillisec(); //1343392590725.6758
string
curMilliSecStrF = curMilliSecDouble.ToString(
"%.4f"
);
//%1343404742649074f
string
curMilliSecStrG = curMilliSecDouble.ToString(
"G"
);
//1343404742649.07
string
curMilliSecStrG4 = curMilliSecDouble.ToString(
"G4"
);
//1.343E+12
string
curMilliSecStr00 = curMilliSecDouble.ToString(
"0.0000"
);
//1343404742649.0700
string
curMilliSecStrF6 = curMilliSecDouble.ToString(
"f6"
);
//1343392590725.680000
string
curMilliSecStr = curMilliSecDouble.ToString();
//1343404742649.07
}
常に4桁の小数を表示できません。【解決過程】
1.Double.ToStringを見つけましたが、何の助けもありません。
2.せっかくマイクロソフトの公式教程を見つけました。標準数値書式の文字列は上記のテストコードを書きましたが、やはり小数点以下の2桁だけを出力しました。
3.ネット上でもこのような問題がありました。
Double.ToStringはどうやって小数点以下の精度を指定しますか?
しかし、誰も説明してくれませんでした。
4.この説明:C〓Double toStringは小数点以下の方法を保留しても私の必要ではない。
5.ここを参考にしてMath.Roundを使います。
?
1
string
roundedDoubleStr = Math.Round(curMilliSecDouble, 4).ToString();
結果の出力はまだ1343392590725.68で、希望の1343392590725.6758ではありません。6.ここを参考にして試してみました。
?
1
string
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
4
double
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
4
double
smallValDouble = 1234.567890;
string
smallValDoubleStrG = smallValDouble.ToString(
"G"
);
//1234.56789
string
smallValDoubleStrF = smallValDouble.ToString(
"F"
);
//1234.57
string
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などのパラメータは実際には有効ではないと思います。