想实现double保留5位小数,不四舍五入

时间:2022-04-11 12:25:13
请问各位大侠,想实现double保留5位小数,不四舍五入,应该怎么实现?
想用转成String再截取,可是如果除不尽的循环小数,会不会溢出?谢谢!

12 个解决方案

#1


不四舍五入是不可能的,由于浮点数的表示有一个精度问题,所以系统在给出计算结果前,就已经进行四舍五入了!如果在这个基础上不进行四舍五入的话,转成字符串,直接截取就行了!不存在溢出的!

#2


溢出问题应该不会发生,字符串的字长要比double高。

#3



Double db = new Double("0.3333333333333334444444444444555555555555555");
System.out.println("Double is:" +db);
BigDecimal bp2 = new BigDecimal("0.3333333333333334444444444444555555555555555");
//你的小数的位数是多少,精度就是多少。
String str = bp2.toString();
System.out.println(str);

输出:

Double is:0.3333333333333334
0.3333333333333334444444444444555555555555555

然后截取字符串就好了。如果真的不要四舍五入,对字符串直接操作就好了。还要转换干什么呢?

#4


不四舍五入的话,楼主的意思是直接忽视5位以后的吗?

#5


用BigDecimal可提高精度范围  不过不四舍五入的话你取5位怎么都不准的~   实际上浮点数是永远取不到精确数的  除非是能在有限位中除尽的~

#6


*100000
取整,

#7


限制小数的位数可以用DecimalFormat 如下:
java.text.DecimalFormat df = new java.text.DecimalFormat( "0.000");
String result=df.format(your double value);
其中0.000中小数点后的0表示要保留小数的位数,result为返回的具有要求的小数位数的串,再转化为相应的double就可以了,如果是进行大数的处理的话可以使用BigDecimal,它有几个不构造函数,其中有参数可以定义精度,具体可以看下API就OK了

#8


double保留5位小数,这个问题还和指数有关。
例如:double a = 0.12345678, b=123.456789;
是不是想得到 a=0.12345, b=123.45678的结果呢?

那 double a=1.2345678e-1, b=1.23456789e+2的结果又是什么呢?

double,可以说他的精度有多少多少位,单独说小数多少多少位是没意义的。
比方说 1.2345678e+123456789123456789,不要说小数部分,十位个位的数都不能保证精度了。

如果真的是要保证小数位的精度,那就用long,63位全部用来保存有效位的。 而double只有52位来保存有效数字。

#9



double d1 = 3.1415926;
int i = (int)(d1*100000);
double d2 = (double)i/100000 ;
System.out.print(d2);


你看看这样行不行?  
上面的代码还能改改 
int i = (int)(d1*100000);
System.out.print((double)i/100000);

#10


保留六位,去掉最后一位

#11


才保留5位的话是完全没问题的··你可以在第7位的时候使用四舍五入啊··这样对结果也没什么影响··

#12


用BigDicmal是一种非常好的解决精度运算的方法。3楼已经给出答案

#1


不四舍五入是不可能的,由于浮点数的表示有一个精度问题,所以系统在给出计算结果前,就已经进行四舍五入了!如果在这个基础上不进行四舍五入的话,转成字符串,直接截取就行了!不存在溢出的!

#2


溢出问题应该不会发生,字符串的字长要比double高。

#3



Double db = new Double("0.3333333333333334444444444444555555555555555");
System.out.println("Double is:" +db);
BigDecimal bp2 = new BigDecimal("0.3333333333333334444444444444555555555555555");
//你的小数的位数是多少,精度就是多少。
String str = bp2.toString();
System.out.println(str);

输出:

Double is:0.3333333333333334
0.3333333333333334444444444444555555555555555

然后截取字符串就好了。如果真的不要四舍五入,对字符串直接操作就好了。还要转换干什么呢?

#4


不四舍五入的话,楼主的意思是直接忽视5位以后的吗?

#5


用BigDecimal可提高精度范围  不过不四舍五入的话你取5位怎么都不准的~   实际上浮点数是永远取不到精确数的  除非是能在有限位中除尽的~

#6


*100000
取整,

#7


限制小数的位数可以用DecimalFormat 如下:
java.text.DecimalFormat df = new java.text.DecimalFormat( "0.000");
String result=df.format(your double value);
其中0.000中小数点后的0表示要保留小数的位数,result为返回的具有要求的小数位数的串,再转化为相应的double就可以了,如果是进行大数的处理的话可以使用BigDecimal,它有几个不构造函数,其中有参数可以定义精度,具体可以看下API就OK了

#8


double保留5位小数,这个问题还和指数有关。
例如:double a = 0.12345678, b=123.456789;
是不是想得到 a=0.12345, b=123.45678的结果呢?

那 double a=1.2345678e-1, b=1.23456789e+2的结果又是什么呢?

double,可以说他的精度有多少多少位,单独说小数多少多少位是没意义的。
比方说 1.2345678e+123456789123456789,不要说小数部分,十位个位的数都不能保证精度了。

如果真的是要保证小数位的精度,那就用long,63位全部用来保存有效位的。 而double只有52位来保存有效数字。

#9



double d1 = 3.1415926;
int i = (int)(d1*100000);
double d2 = (double)i/100000 ;
System.out.print(d2);


你看看这样行不行?  
上面的代码还能改改 
int i = (int)(d1*100000);
System.out.print((double)i/100000);

#10


保留六位,去掉最后一位

#11


才保留5位的话是完全没问题的··你可以在第7位的时候使用四舍五入啊··这样对结果也没什么影响··

#12


用BigDicmal是一种非常好的解决精度运算的方法。3楼已经给出答案