1 package com;
2
3 import java.math.BigDecimal;
4 import java.text.DecimalFormat;
5
6 public class WorkLookProblem {
7 /**
8 * double 只能到千万级别,如果不处理就会变成科学计数法
9 * 而且double处理数据很容易出现精度丢失问题,金额计算推荐使用BigDecimal
10 */
11 public static void doubleEqual() {
12 double item = 0;
13 item += 6650000.0;
14 item += 615414.6;
15 item += 1901423.8;
16 item += 686655.04;
17 item += 6326097.4;
18 item += 700000.0;
19 item += 629923.03;
20 item += 907064.34;
21 item += 3952813.72;
22 item += 4107611.6;
23 item += 700000.0;
24 item += 1722996.47;
25 item += 1100000.00;
26 //item -= 0.01;
27 if(item > Double.parseDouble("30000000.00")) {
28 System.out.println(false);
29 }else {
30 System.out.println(true);
31 }
32 System.out.println(item);
33
34 BigDecimal big = new BigDecimal(Double.toString(item));
35 System.out.println(big.setScale(2,BigDecimal.ROUND_HALF_UP));
36
37 DecimalFormat df = new DecimalFormat("0.00");
38 String result= df.format(item);
39 System.out.println(String.valueOf(result));
40 }
41
42 public static void main(String[] args) {
43 doubleEqual();
44 }
45 }
理论上double-item应该和Double.parseDouble()结果相等,但是由于数值超千万,导致数值自动转换为科学计数法,且转换后发现小数数值尾号多了0.0000000000000004的精度问题。
这是由于double本身构造导致的。所以进行大金额计算的时候,通常建议使用BigDecimal。
![]()