Java将秒转换为年日小时秒

时间:2014-06-05 16:56:23

标签: java int double biginteger

我有一个关于Java中真正大数字的问题。 我目前正在尝试将由大量秒组成的双精度转换为年,日,小时,分钟和剩余的秒数。 我的代码看起来像这样:`

import java.util.Scanner;


 public class timer {


 public static void main(String[] args){



     double sum = 1.1078087563769418E16;

    double sec=0;
    double min=0;
    double hou=0;
    double da=0;
    double yea=0;


    yea=sum/31536000;
    int year = (int) yea;
    sum=sum-year*31536000;

    da=sum/86400;
    int day = (int) da;
    sum=sum-day*86400;

    hou=sum/3600;
    int hour = (int) hou;
    sum=sum-hour*3600;

    min=sum/60;
    int minute = (int) min;
    sum=sum-minute*60;

    sec=sum;
    int second = (int) sec;
    sum=sum-second*60;

    System.out.println(year+" "+day+" "+hour+" "+minute+" "+second);            
}
}

`

当双“和”与它一样大时,输出变得奇怪。例如,双“天”变得大于365,这是不可能的。

任何解决方案?

4 个答案:

答案 0 :(得分:1)

计算溢出sum=sum-year*31536000;

year31536000都是整数,它们的乘积是〜1E16,大于java的最大整数大小。请改用sum = sum-year*31536000.0

作为演示,请在计算year后添加此代码:

System.out.println(year * 31536000.0); //  1.1078087556672E16
System.out.println(year * 31536000);   //  1100687872

答案 1 :(得分:1)

您面临着一个非常常见的问题,大多数开发人员应该知道:整数溢出。

你的年变量是一个int,第二年和第二年转换的常量是常量int,所以int * int是... int。除非你的年份大于约68,否则结果不适合int。因此 - 溢出和愚蠢的结果。

您有几种选择:

  1. 用longs做你的时间戳算术。真的,无论如何,这是行业标准。
  2. 如果您坚持精确度超过微秒(或者如果您仅关注上个世纪的纳米) - BigDecimal或BigInteger是您的朋友。
  3. 使用TimeUnit包中的concurrent类。它没有多年,但确实有几天并且转换得很好(尽管JodaTime会更好)

答案 2 :(得分:0)

如果需要高精度地表示数字,可以使用java.math。 BigDecimal 类。

如果您需要大整数,可以使用java.math。 BigInteger

答案 3 :(得分:0)

        First use long not double then try this logic

            long min = sum / (60) % 60;
            long hou = sum / (60 * 60 )% 24;
            long da = sum/(60*60*24)%30;
            long yea = sum/(60*60*24*30)%365;

如果该数字超出了long的限制,那么使用BigInteger但是这个计算将不起作用。