背景:
回顾上文,由于double类型转String类型数字过小或者过大时,会自动转为科学计数法。需采用decimal format来格式化double与float的结果,这样转换成字符串不会采用科学计数法。但是根据“#”占位符进行转换时,发现获得的结果并非按照四舍五入的舍入数值方法。
public static void main(String args[]) {
Double a = 3.25,b = 3.251,c = 3.35;
DecimalFormat df = new DecimalFormat("#.#");
System.out.println(df.getRoundingMode());//decimal format默认舍入方法
System.out.println("a:" + df.format(a) + "\n" + "b:" + df.format(b) + "\n" + "c:" + df.format(c));
}
DecimalFormat 默认使用的是进位方式是RoundingMode.HALF_EVEN,此舍入模式也称为“银行家算法”,主要在美国使用。
银行家算法:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一
规律就是看进舍位的前一位是奇数还是偶数
奇数:四舍五入
偶数:五舍六入
若进舍位是5,且后面非0:进一
如3.25 保存一位小数,进舍位前一位是2,2是偶数,五舍六入 结果就是3.2,如果是3.26 结果就是3.3;
如3.251 保存一位小数,5后面非0,所以会进一,即3.3;
再如3.35 保存一位小数 进舍位前一位是3,3是奇数,四舍五入 结果就是3.4。
如果想实现四舍五入,增加下面代码,切换进位方式
df.setRoundingMode(RoundingMode.HALF_UP);
public static void main(String[] args) {
DecimalFormat df=new DecimalFormat("#.#");
df.setRoundingMode(RoundingMode.HALF_UP);//HALF_UP四舍五入
double a=3.25,b=3.35;
System.out.println(df.format(a)); //3.3
System.out.println(df.format(3.251)); //3.3
System.out.println(df.format(b)); //3.4
}
Java 中保留小数方法
1. 使用java.text.DecimalFormat
public static String format2(double value) {
DecimalFormat df = new DecimalFormat("0.00");
df.setRoundingMode(RoundingMode.HALF_UP);
return df.format(value);
}
2. 使用java.text.NumberFormat
public static String format3(double value) {
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
/*
* setMinimumFractionDigits设置成2
*
* 如果不这么做,那么当value的值是100.00的时候返回100
*
* 而不是100.00
*/
nf.setMinimumFractionDigits(2);
nf.setRoundingMode(RoundingMode.HALF_UP);
/*
* 如果想输出的格式用逗号隔开,可以设置成true
*/
nf.setGroupingUsed(false);
return nf.format(value);
}
3. 使用java.util.Formatter
public static String format4(double value) {
/*
* %.2f % 表示 小数点前任意位数 2 表示两位小数 格式后的结果为 f 表示浮点型
*/
return new Formatter().format("%.2f", value).toString();
}
4. 使用String.format
public static String format5(double value) {
return String.format("%.2f", value).toString();
}
扩展知识
String.format 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能。
占位符格式为: %[index$][标识]*[最小宽度][.精度]转换符
double num = 123.4567899;
System.out.