我有一个关于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,这是不可能的。
任何解决方案?
答案 0 :(得分:1)
计算溢出sum=sum-year*31536000;
year
和31536000
都是整数,它们的乘积是〜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。因此 - 溢出和愚蠢的结果。
您有几种选择:
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但是这个计算将不起作用。