Java将秒转换为年天小时分钟秒。

3

我在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);            
}
}

当双重“sum”变得非常大时,输出结果会变得奇怪。例如,双重“day”变得比365还要大,这应该是不可能的。

有什么解决办法吗?

4个回答

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
您面临着一个非常普遍的问题,大多数开发人员应该都知道:整数溢出。
您的年份变量是int类型,秒到年的转换常量也是int类型,所以int*int得到的结果还是int类型。除非您的年份大于约68年,否则结果无法适合int类型。因此-溢出和愚蠢的结果。
您有几个选项可供选择:
1. 在long中执行时间戳算术运算。实际上,这才是行业标准。 2. 如果您坚持要精度超过微秒(或者如果您只关心上个世纪的纳米),BigDecimal或BigInteger是您的好伙伴。 3. 使用concurrent包中的TimeUnit类。它没有年份,但是有天数,并且可以很好地进行转换(JodaTime会更好)。

0

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

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


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,但这个计算将无法工作。

你的解决方案完全忽略了秒,而 OP 明确要求包括秒。 - arkon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接