Java 保留两位小数
在实际项目开发中,经常会存在浮点数四舍五入保留几位小数的问题,故收集了几种常用方法:
直接上代码(保留两位小数)。
Format.java:
import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; class Format { private double src_num; public Format(double num){ src_num = num; } /* * BigDecimal,数字构造 */ public void fun1() { BigDecimal bg = new BigDecimal(src_num); //数字2代表保留两位 double des_num = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); System.out.println(des_num); } /* * BigDecimal,字符串构造 */ public void fun2() { BigDecimal bg = new BigDecimal(String.valueOf(src_num)); //数字2代表保留两位 double des_num = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); System.out.println(des_num); } /* * DecimalFormat */ public void fun3() { //#.00 表示两位小数 ,#.0000四位小数 以此类推... DecimalFormat df = new DecimalFormat("#.00"); System.out.println(df.format(src_num)); } /* * String.format */ public void fun4() { //%. 表示 小数点前任意位数,2 表示两位小数,格式后的结果为f 表示浮点型 System.out.println(String.format("%.2f", src_num)); } /* * NumberFormat */ public void fun5() { NumberFormat nf = NumberFormat.getNumberInstance(); //2为格式化对象设定小数点后的显示的最多位,显示的最后位是舍入的 nf.setMaximumFractionDigits(2); System.out.println(nf.format(src_num)); } /* * Math.round */ public void fun6() { double des_num = (double)Math.round(src_num * 100) / 100; System.out.println(des_num); } }
TestDemo.java:
public class TestDemo { public static void main(String[] args) { double num = 3.1415926; //double num = 4.015; //double num = 4.016; //double num = 999999999.015; Format format = new Format(num); format.fun1(); format.fun2(); format.fun3(); format.fun4(); format.fun5(); format.fun6(); } }
让我们看下运行结果:
3.1415926
3.14 3.14 3.14 3.14 3.14 3.14
4.015:
4.01 4.02 4.01 4.02 4.01 4.01
4.016:
4.02 4.02 4.02 4.02 4.02 4.02
999999999.015:
9.9999999901E8 9.9999999902E8 999999999.01 999999999.02 999,999,999.01 9.9999999902E8
普通开发中,对计算精度要求不算太严格的话,上面的方法都适用(科学计数法转换的话会比较繁琐)。
但对于一些精度要求较高的商业运算,误差0.01就可能造成比较大的问题。
产生上述问题的原因还是在于浮点数在计算机中本来就是不精确的,参考:http://justjavac.iteye.com/blog/1073775
从上述结果中,可以看出fun2()和fun4()是始终OK的。
因此推荐两种方式进行浮点数小数位数保留:
①BigDecimal,字符串构造
②String.format转换