[英]Loss of precision - Java
问题陈述:
编写方法whatTime,该方法需要一个整数秒(代表某天午夜以来的秒数),并返回一个格式为“ ::”的String。 此处,代表自午夜以来的完整小时数,代表自上一个完整小时结束以来的完整分钟数,并代表自上一个完整分钟结束以来的秒数。 ,,和中的每个都应为整数,且没有多余的前导0。 因此,如果秒为0,则应返回“ 0:0:0”,而如果秒为3661,则应返回“ 1:1:1”
我的算法:
这是我的算法应该对输入3661起作用的方式:
但是,产生的输出是1:1:0。 我尝试使用打印语句,看来'answer3'变量的值为0.999,这就是为什么打印整数部分(0)的原因。 我试图使用Math.ceil()函数将值取整,并产生正确的输出。 但是,提交代码(TopCoder SRM 144 Div2)时,我只能得分约60/250分。 对于改进算法的任何见解都会有所帮助。
public class Time
{
public String whatTime(int seconds)
{
double answer1,answer2,answer3; int H;
answer1=(double)seconds/3600;
H=(int)answer1;
answer2=(double)((answer1-H)*60);
int M=(int)answer2;
answer3=answer2-M;
answer3=(double)answer3*60;
int S=(int)answer3;
String answer=Integer.toString(H);
answer=Integer.toString(H)+":"+Integer.toString(M)+":"+Integer.toString(S);
return answer;
}
}
避免使用浮点值,并完全使用int或long。
public String whatTime(int seconds) {
int secondVal = seconds % 60;
int minutes = seconds / 60;
int minuteVal = minutes % 60;
int hours = minutes / 60;
int hourVal = hours % 24;
int daysVal = hours / 24;
String answer = "" + daysVal + ":" + hourVal + ":" + minuteVal + ":" + secondVal;
return answer;
}
可以更优雅地进行格式化,但这是基本思想。
您可以通过使用ints来解决此问题:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.