我对 Java 中非常大的数字有疑问。 我目前正在尝试将由大量秒组成的 double 转换为年、天、小时、分钟和剩下的秒数。 我的代码如下所示:`
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,这应该是不可能的。
有什么解决办法吗?
最佳答案
您正面临一个大多数开发人员都应该知道的非常普遍的问题:整数溢出。
你的year变量是一个int,second->year转换的常量是constant int,所以int*int是……int。除非您的年份大于大约 68,否则结果不能放入 int 中。因此 - 溢出和愚蠢的结果。
您有几个可用的选项:
- 用长整数计算时间戳。真的,这无论如何都是行业标准。
- 如果您坚持超过微秒的精度(如果您只关心上个世纪,则为纳精度)- BigDecimal 或 BigInteger 是您的 friend 。
- 使用
concurrent
包中的TimeUnit
类。它没有年限,但有天数并且可以很好地进行转换(不过 JodaTime 会更好)
关于Java将秒转换为年日时分秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24065958/