两个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;
}