C#中将double变量格式化为字符串,且保留小数点后面的全部位数

原文:

http://www.crifan.com/csharp_format_double_to_string_with_dicimal_point/

【问题】

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位的小数。

【解决过程】

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#里double变量的ToString()会自动截取2位,是什么情,看到其提示说,根本不是小数点后面几位的问题,而是总位数的问题.

然后可以看出,对于: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等参数没有实际生效呢。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值