java maptodouble_Lambda表达式mapToDouble.sum精度问题

public static void main(String[] args) {

List 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 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());

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值