划船去巴黎

导航

Double处理数据出现精度丢失问题


 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。

 


 

 

 

posted on 2020-07-14 20:34  划船去巴黎  阅读(599)  评论(0编辑  收藏  举报