【问题标题】:Avoid Rounding Error on Double -> Date conversion避免 Double -> Date 转换时的舍入错误
【发布时间】:2013-04-21 17:58:36
【问题描述】:

在我的程序中,我收到了以毫秒为单位定义时间戳的字符串。现在我需要将其转换为正确的日期。我找到的解决方案如下所示:

String aTime = "1365504203.0269";
double t = Double.parseDouble(aTime);

Date date = new Date((long)t*1000);
SimpleDateFormat dateFormatDDMMYYYY = new SimpleDateFormat("dd.MM.yyyy");
SimpleDateFormat dateFormatHHMMssSS = new SimpleDateFormat("HH:mm:ss:SS");
String day = new String(dateFormatHHMMssSS.format(date));
String hour = new String(dateFormatDDMMYYYY.format(date));

System.out.println("The Date: "+day);
System.out.println("The Time: "+hour);

不幸的是,这会从时间戳中删除毫秒的精度。 (我不确定时间是否准确,因为我已经想不起来了。)

它是因为 double->long 转换而丢失,还是根本不存在?有什么办法可以解决这个问题?

【问题讨论】:

    标签: java date time type-conversion


    【解决方案1】:

    问题出在这句话中:

    Date date = new Date((long)t*1000);
    

    它首先将 double 转换为 long,从而截断小数位,然后乘以 1000,即添加三个零。试试这个:

    Date date = new Date((long)(t*1000.0));
    

    它使用double作为乘法的数据类型,将小数位移动到整数部分,然后将小数位截断long转换。

    使用1000.0 而不是1000 作为常量强制常量也为double 类型,增加了一个额外的确定性,即乘法将发生在双精度数上。

    【讨论】:

    • 我会放弃使用double 并改用BigDecimal 以获得更高的精度。
    • +1,很好的发现!只是一点点编辑:乘以 1000 添加三个零;)
    • 太棒了!非常感谢:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2019-12-15
    • 2011-03-26
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多