C#Double保留⼩数点后⾯位数
C# Double保留⼩数点后⾯位数
有的时候我们要对⼀些数据进⾏百分⽐的操作。⼀般的数据我们只要⽤ .ToString("P")就可以得到⼩数点后2位的百分⽐。⽽且是⾃动
加上%号的可是有些时候,我们要的⼩数点后位数要多⼀些,⽐如说六位,或是四位.ToString("f4")这⾥你想在⼩数点后留⼏位就写F⼏。这次的数值,不会⾃动加%号,要我们⾃⼰加上.
Double salary1 = 10000.0;
Double salary2 = 10000.12345;
Double salary3 = 10000.1289;
Int salary4 = 10000;
string salary5 = "10000";
string salary6 = "10000.12345";
string salary7 = "10000.1289"
Convert.ToDouble(salary1).ToString("0.00");//保留⼩数点后两位,结果为10000.00
Convert.ToDouble(salary2).ToString("0.00");//保留⼩数点后两位,结果为10000.12
Convert.ToDouble(salary3).ToString("0.00");//保留⼩数点后两位,结果为10000.13
Convert.ToDouble(salary4).ToString("0.00");//保留⼩数点后两位,结果为10000.00
Convert.ToDouble(salary5).ToString("0.00");//保留⼩数点后两位,结果为10000.00
Convert.ToDouble(salary6).ToString("0.00");//保留⼩数点后两位,结果为10000.12
Convert.ToDouble(salary7).ToString("0.00");//保留⼩数点后两位,结果为10000.13
(转)
【问题】
C#中已经获得⼀个double变量值,⽐如1343392590725.6758,然后想要将其转换为字符串,且保留全部的⼩数点后的4位,但是结果却是:
private void doubleToStringTest()
{
double curMilliSecDouble = 1343392590725.6758;
//double curMilliSecDouble = CurTimeInMillisec(); //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.07bigdecimal除法保留小数
}
始终都不能显⽰出4位的⼩数。
【解决过程】
1.到了,但是没啥帮助。
2.后来好不容易到了微软官⽅教程:,并写出了上述测试代码,但是始终还是只是输出⼩数点后2位。
3.⽹上这⼈也遇到了类似问题:
但是没⼈解释的清楚.
4.⽽这个解释:也不是我所需要的.
5.参考去⽤Math.Round:
string roundedDoubleStr = Math.Round(curMilliSecDouble, 4).ToString();
结果输出还是1343392590725.68,⽽不是所希望的1343392590725.6758
6.参考去试了是#:
string curMilliSecStrXing = curMilliSecDouble.ToString("#.####"); //1343392590725.68
结果问题依旧。
7.后来参考:,看到其提⽰说,根本不是⼩数点后⾯⼏位的问题,⽽是总位数的问题.
然后可以看出,对于:1343392590725.6758
其共17位数字,整数部分13位,⼩数部分4位
然后就去故意测试少⼀位的情况,⽐如:
343392590725.6758
此double值,其共16位数字,整数部分12位,⼩数部分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值去测试:
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等参数没有实际⽣效呢。
如何把double类型四舍五⼊到⼩数后两位(转)
double类型四舍五⼊和数据格式化的⼏种⽅法:
1. double value = 11.11111111;
DecimalFormat df = new DecimalFormat("##.00"); value = Double.parseDouble(df.format(value)); System.out.println(value);
结果为11.11
--------------------------------------------------------------------------------
2. double d = 22.365434; BigDecimal a = new BigDecimal(d);
//第⼀个参数2是⼩数点后保留⼏位,第⼆个2是四舍五⼊(如果为1则直接舍掉后⾯多余的位)
System.out.println("a.setScale(2,2)=" + a.setScale(2, 2));
--------------------------------------------------------------------------------
转贴
// 四舍五⼊取⼩数点后 2 位。
float f = 1.234567F;
f = float.Parse(f.ToString("F2"));
Console.WriteLine(f.ToString());
Math.Round()这个是四舍五⼊的
f.ToString("0.00");这个只是⽤来显⽰的
double d = 1.234567;
Console.WriteLine(d.ToString("F"));
Math.Round(double1, 2); 這是最正宗的⽅法如果你要隻顯⽰到屏幕也可以這樣
Console.WriteLine(double1.ToString("###,###,###.##");
很多都是四舍五⼊的,只好⽤这个笨办法:
double d = (double)((long)(2.378325*100))/100;
MessageBox.Show(d.ToString(".##"));
刚才贴的那个⽅法如果末尾刚好是0数字就会不⾜2位⼩数位,改为这个:
MessageBox.Show(((double)((long)(45452.318325*100))/100).ToString(".00"));
例如:2.3023 处理后得到 2.30
double aa=345.6443; int bb; Decimal cc;
bb=Decimal.Round(aa,2);
OK了
double d = 2.378325;
d = double.Parse(d.ToString("0.00"));
不过这样会四舍五⼊,结果是2.38
1/string str="2.378325";
str=str.Substring( x,y);⽤remove也可以
2/double d = 2.378325*100;……这样就更好处理⼀些
笨⽅法
double d=2.378325; int i=d.ToString().LastIndexOf("."); if(i!=-1) { d=Convert.ToDouble(d.ToString().Substring(0,i+3)); } else { d=d; }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论