`

两个double数相减错误(数据太小,会出现科学计数E)

    博客分类:
  • java
阅读更多

两个double数相减错误:
实际上是转化错误
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;


public class DatMinus {
 Workbook b;
 String [] sss=new String[]{
   "20120802 18:30:59", "20120802 18:31:00"        //使用这两个参数,会出现错误结果?
 };

 /**
  * 两个日期相减,换成小时数
  */
 public static void main(String[] args) throws Exception{

  DatMinus dm=new DatMinus();

  

  
 
  for(int i=0;i<17;i++){
   double dd=dm.minusDate(dm.sss[2*i], dm.sss[2*i+1]);
   System.out.println(dd);
  }
 }
 
 
 double minusDate(String date1,String date2) throws Exception{
  SimpleDateFormat f=new SimpleDateFormat("yyMMdd HH:mm:ss");
  
  Date d1=f.parse(date1);
  Date d2=f.parse(date2);
  double d1Hour=0.0f;
  double d2Hour=0.0f;
  d1Hour=d1Hour+d1.getHours()+d1.getMinutes()/60.0+d1.getSeconds()/3600.0;
  d2Hour=d2Hour+d2.getHours()+d2.getMinutes()/60.0+d2.getSeconds()/3600.0;
  
  double val=d2Hour-d1Hour;             //问题就出现在这里,两个double相减,出现了科学计数的方式E
  if(d2.getDate()-d1.getDate()>0){//不在同一天
   val=val+24;
  }
  String v=String.valueOf(val);
  String v2=v.substring(v.indexOf("."));
  if(v2.length()>3){
   v=v.substring(0,v.indexOf(".")+3);
  }
  
  System.out.println(v); 
  return val;
 }

 
}

//两个double分别为:18.51638888888889     18.516666666666666   2.7777777777515666E-4

 

-------------使用BigDecimal解决精确计算,避免科学计算E的出现------
double minusDate2(String date1,String date2) throws Exception{
  SimpleDateFormat f=new SimpleDateFormat("yyMMdd HH:mm:ss");
  
//  SimpleDateFormat f2=new SimpleDateFormat("yyMMdd.HH:mm");
  
  Date d1=f.parse(date1);
  Date d2=f.parse(date2);
  double d1Hour=0.0d;
  double d2Hour=0.0d;
  
  d1Hour=d1Hour+d1.getHours()+d1.getMinutes()/60.0+d1.getSeconds()/3600.0;
  d2Hour=d2Hour+d2.getHours()+d2.getMinutes()/60.0+d2.getSeconds()/3600.0;
  System.out.println(d1Hour+"     ");
  System.out.println(d2Hour+" ");
//  double val=d2Hour-d1Hour;
  if(d2.getDate()-d1.getDate()>0){//不在同一天
   d1Hour+=(d2.getDate()-d1.getDate())*24;
  }
  MathContext mc=new MathContext(2,
          RoundingMode.FLOOR);
  BigDecimal bd1=new BigDecimal(d1Hour,mc);
  BigDecimal bd2=new BigDecimal(d2Hour,mc);
  BigDecimal bd=bd2.subtract(bd1);
  double val=bd.doubleValue();
  
  System.out.println(val); 
  return val;
 }


------------------------------
//只处理了date2>date1的情况,没有处理date2<date1
 String minusDate3(String date1,String date2) throws Exception{
  SimpleDateFormat f=new SimpleDateFormat("yyMMdd HH:mm:ss");
  Date d1=f.parse(date1);
  Date d2=f.parse(date2);
  double d1Hour=0.0f;
  double d2Hour=0.0f;
  d1Hour=d1Hour+d1.getHours()+d1.getMinutes()/60.0+d1.getSeconds()/3600.0;
  d2Hour=d2Hour+d2.getHours()+d2.getMinutes()/60.0+d2.getSeconds()/3600.0;
  
//  double val=d2Hour-d1Hour;
  if(d2.getDate()-d1.getDate()>0){//不在同一天
   d1Hour+=(d2.getDate()-d1.getDate())*24;
  }
  String v1=String.valueOf(d1Hour);
  String v2=String.valueOf(d2Hour);
  String v21=v1.substring(v1.indexOf("."));
  if(v21.length()>3){
   v1=v1.substring(0,v1.indexOf(".")+3);
  }
  
  String v22=v2.substring(v2.indexOf("."));
  if(v22.length()>3){
   v2=v2.substring(0,v2.indexOf(".")+3);
  }
  double val=Double.parseDouble(v2)-Double.parseDouble(v1);
  
  String v4=String.valueOf(val);
  String v44=v4.substring(v4.indexOf("."));
  if(v44.length()>3){
   v4=v4.substring(0,v4.indexOf(".")+3);
  }
  System.out.println(v4); 
  return v4;
 }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics