今天测试测出消息传递过程中有个小数精确度有问题。
要求保留小数点6位,不够的用0补充,结果开发时没注意,0.123456格式控制后变成了.123456,虽然从的值的角度来说没有区别,但是下游收到消息的人不认。。。。。。
总结了以下常见的四舍五入方法:
class="java" name="code">public static void main(String[] args) { System.out.println(getNum(0.23656,"#.0000",false));//.2365 不四舍五入,整数部分为0时省略 System.out.println(getNum(0.23656,"0.0000",false));//0.2365不进行四舍五入,整数部分为0时不省略 System.out.println(getNum(0.23656,"0.0000",true));//0.2366 进行四舍五入 System.out.println(getNum(0.236,"0.0000",true));//0.2366 进行四舍五入 不够的小数部分补零 // // System.out.println(getNum2(0.23456,3));//精确小数点第三位,四舍五入 //System.out.println(getNum3(0.2345,3,false));//0.234 // System.out.println(getNum4(0.2345,3,false));//0.234 // System.out.println(getNum4(0.2345,3,true));//0.235 // System.out.println(getNum4(0.23,3,false));//0.23 没有补零 } public static String getNum(double str,String pattern,boolean flag){ DecimalFormat format = new DecimalFormat(pattern);//保留小数点三位 if(flag) { format.setRoundingMode(RoundingMode.UP);//进行四舍五入 } else { format.setRoundingMode(RoundingMode.DOWN);//不进行四舍五入 } return format.format(str); } public static String getNum2(double str , int decima) { long n = 1; for(int i = 1 ; i <= decima; i++ ) n *= 10; return String.valueOf((int)(str * n +0.5) / (n * 1.0)); } public static double getNum3(double str,int point, boolean flag){ BigDecimal b = new BigDecimal(str); if(flag) { return b.setScale(point, BigDecimal.ROUND_HALF_UP).doubleValue(); } return b.setScale(point, BigDecimal.ROUND_HALF_DOWN).doubleValue(); } public static String getNum4(double d,int point,boolean flag) { NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(point); // 保留小数点位数 if(flag){ nf.setRoundingMode(RoundingMode.UP);//四舍五入 }else { nf.setRoundingMode(RoundingMode.DOWN);// 不四舍五入 } return nf.format(d); }
?