Lambda表达式mapToDouble.sum精度问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lambda表达式mapToDouble.sum精度问题相关的知识,希望对你有一定的参考价值。
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());
以上是关于Lambda表达式mapToDouble.sum精度问题的主要内容,如果未能解决你的问题,请参考以下文章