原文:

【問題】

C#中已經獲得一個double變數值,比如1343392590725.6758,然後想要將其轉換為字串,且保留全部的小數點後的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位的小數。

【解決過程】

2.後來好不容易找到了微軟官方教程:標準數值格式字串,並寫出了上述測試程式碼,但是始終還是隻是輸出小數點後2位。

3.網上這人也遇到了類似問題:

但是沒人解釋的清楚.

5.參考這裡去用Math.Round:

1
string roundedDoubleStr = Math.Round(curMilliSecDouble, 4).ToString();

結果輸出還是1343392590725.68,而不是所希望的1343392590725.6758

6.參考這裡去試了是#:

1
string curMilliSecStrXing = curMilliSecDouble.ToString("#.####"); //1343392590725.68

結果問題依舊。

然後可以看出,對於:1343392590725.6758

其共17位數字,整數部分13位,小數部分4位

然後就去故意測試少一位的情況,比如:

343392590725.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位小數點

F6:輸出小數點後6位,不夠的話用0補齊

G:預設輸出原先的,保留小數點後面的位數(對於double預設是最多15個,詳見:標準數值格式字串)。

【總結】

此處像1343392590725.6758一樣的double值,不論去用ToString格式化輸出,不論引數是F還是G,還是FN或GN,結果都還是2位的小數點,其原因在此double值太大了,總的位數,正好是13+4=17,而實際上內部最多隻能存15位,所以實際上小數點後面只有2位,所以輸出的時候,始終只能輸出2位,正巧和F引數預設輸出2位所吻合,所以以為F和G等引數沒有實際生效呢。