这个问题很常见,也很容易解决,常用的方法有如下几种:
先将double/float类型的数据转换为BigDecimal类型,然后再使用BigDecimal类的setScale方法,设置四舍五入以及保留的小数位数
public void testDouble()
{
double num = 3.555555f;
BigDecimal bd = new BigDecimal(num);
bd = bd.setScale(4, RoundingMode.HALF_UP);
// .getClass()获得变量的类型
System.out.println(bd.getClass());
System.out.println(bd);
// 上面转换之后的bd为BigDecimal类型的数据,如果想转换为double,需要使用下面的转换方式。
//.doubleValue将数字转换为double,Double.parseDouble()将字符串转换为double
num = bd.doubleValue();
}
//输出结果为:
// class java.math.BigDecimal
// 3.5556
public class Demo
{
public static void main(String[] args)
{
BigDecimal a = new BigDecimal(3.6666666666);
BigDecimal b = new BigDecimal(-3.650000001);
System.out.println(a.setScale(2,BigDecimal.ROUND_UP));
System.out.println(b.setScale(2,BigDecimal.ROUND_UP));
}
}
//输出结果
// 3.660000001——>3.67
// 3.666666666——>3.67
// -3.65000001——>-3.66
// -3.65000000——>3.65
public class Demo
{
public static void main(String[] args)
{
BigDecimal a = new BigDecimal(3.66666666);
BigDecimal b = new BigDecimal(-3.66666666);
System.out.println(a.setScale(2,BigDecimal.ROUND_DOWN));
System.out.println(b.setScale(2,BigDecimal.ROUND_DOWN));
}
}
//输出结果为:
// 3.66
// -3.66
public class Demo
{
public static void main(String[] args)
{
BigDecimal a = new BigDecimal(3.66666666);
BigDecimal b = new BigDecimal(-3.66666666);
System.out.println(a.setScale(2,BigDecimal.ROUND_CEILING));
System.out.println(b.setScale(2,BigDecimal.ROUND_CEILING));
}
}
//输出结果为:
// 3.67
// -3.66
public class Demo
{
public static void main(String[] args)
{
BigDecimal a = new BigDecimal(3.66666666);
BigDecimal b = new BigDecimal(-3.66666666);
System.out.println(a.setScale(2,BigDecimal.ROUND_FLOOR));
System.out.println(b.setScale(2,BigDecimal.ROUND_FLOOR));
}
}
//输出结果为:
// 3.66
// -3.67
public class Demo
{
public static void main(String[] args)
{
BigDecimal a = new BigDecimal(3.66666666);
BigDecimal b = new BigDecimal(-3.66666666);
System.out.println(a.setScale(2,BigDecimal.ROUND_HALF_DOWN));
System.out.println(b.setScale(2,BigDecimal.ROUND_HALF_DOWN));
}
}
//输出结果为:
// 3.67
// -3.67
DecimalFormat是一种数据格式化方式,首先实例化一个数据格式化方式df,并且指定保留两位小数,然后指定四舍五入的规则,然后使用df.format()即可完成格式化,值得注意的是,df.format()之后得到的结果是String类型的数据。
public void Demo()
{
double num = 3.555555f;
DecimalFormat df = new DecimalFormat("0.00");
df.setRoundingMode(RoundingMode.HALF_UP);
System.out.println(df.format(num).getClass());
System.out.println(df.format(num));
// Double.parseDouble将String类型的数据转换为Double类型
num = Double.parseDouble(df.format(num));
}
//输出结果为:
// class java.lang.String
// 3.56
.00 表示两位小数 #.0000四位小数 以此类推...
public class Demo
{
public static void main(String[] args)
{
double decimal=2.15545422;
DecimalFormat df=new DecimalFormat("#.0000");
String format = df.format(decimal);
double v = Double.parseDouble(format);
System.out.println(v);
}
}
java.util.Formatter方法最为简单,首先实例化一个Formatter对象,指定格式化的类型和数据,然后获得一个Formatter对象,再将这个对象转换为String,再转换为Double。
public void testFormatter()
{
Formatter format = new Formatter().format("%.2f", num);
// String.valueOf()和.toString方法都能转换为String,不过String.valueOf()更常用
num = Double.parseDouble(String.valueOf(format));
}
%.2f %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型
这种方法也非常简单,使用String.format()方法将double类型的数据转换为String类型的数据,然后再根据需要变换即可。
public void testStringFormat()
{
String format = String.format("%.2f", num);
System.out.println(format.getClass());
System.out.println(Double.parseDouble(format));
Double d = Double.parseDouble(String.format("%.2f",Math.sin(Math.PI/6)));
System.out.println(d);
}
public class DecimalFormatDemo
{
public static void main(String[] args)
{
double decimal=2.15555422;
/*
DecimalFormat df=new DecimalFormat("#.0000");
String format = df.format(decimal);
double v = Double.parseDouble(format);
System.out.println(v);
*/
/*
String format = String.format("%.3f", decimal);
double v = Double.parseDouble(format);
System.out.println(v);
*/
// NumberFormat ddf1=NumberFormat.getNumberInstance() ;
// void setMaximumFractionDigits(int digits)
// digits 显示的数字位数 为格式化对象设定小数点后的显示的最多位,显示的最后位是舍入的
NumberFormat nf=NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(3);
String format = nf.format(decimal);
double v = Double.parseDouble(format);
System.out.println(v);
}
}