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。