Lambda表达式mapToDouble.sum精度问题

匿名 (未验证) 提交于 2019-12-02 23:42:01
public static void main(String[] args) {         List<Double> doubles = Arrays.asList(new Double(3.3), new Double(3.3), new Double(3.3));         double sum = doubles.stream().mapToDouble(Double::doubleValue).sum();         System.out.println(sum);// 9.899999999999999         System.out.println(formatDigit(sum,2));// 9.9         System.out.println(formatDigit_down(sum, 2)); // 9.89         List<Double> doubles1 = Arrays.asList(new Double(1.1), new Double(1.1), new Double(1.1));         double sum1 = doubles1.stream().mapToDouble(Double::doubleValue).sum();         System.out.println(sum1);// 3.3000000000000003         System.out.println(formatDigit(sum1,2));// 3.3         System.out.println(formatDigit_down(sum1, 2));// 3.3     }     /**      * 将数据转换为保留指定小数位数(0,1,2)格式的数,四舍五入      *      */     public static double formatDigit(double num, int decimalPlace) {         DecimalFormat fm = null;         switch (decimalPlace) {             case 0:                 fm = new DecimalFormat("##");                 break;             case 1:                 fm = new DecimalFormat("##.#");                 break;             case 2:                 fm = new DecimalFormat("##.##");                 break;             case 3:                 fm = new DecimalFormat("##.###");                 break;             case 4:                 fm = new DecimalFormat("##.####");                 break;             default:                 break;         }          if (fm == null) {             return num;         }          StringBuffer sbf = new StringBuffer();         fm.format(num, sbf, new FieldPosition(java.text.NumberFormat.FRACTION_FIELD));         return Double.parseDouble(sbf.toString());     }      /**      * 将数据转换为保留指定小数位数(0,1,2)格式的数。向下取值:如 5.567 -> 5.56 -5.567 -> -5.56      */     public static double formatDigit_down(double num, int decimalPlace) {         DecimalFormat fm = null;         switch (decimalPlace) {             case 0:                 fm = new DecimalFormat("##");                 break;             case 1:                 fm = new DecimalFormat("##.#");                 break;             case 2:                 fm = new DecimalFormat("##.##");                 break;             case 3:                 fm = new DecimalFormat("##.###");                 break;             case 4:                 fm = new DecimalFormat("##.####");                 break;             default:                 break;         }          if (fm == null) {             return num;         }          StringBuffer sbf = new StringBuffer();         fm.setRoundingMode(RoundingMode.DOWN);// 向下取值设置、         fm.format(num, sbf, new FieldPosition(java.text.NumberFormat.FRACTION_FIELD));         return Double.parseDouble(sbf.toString());     }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!