[英]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.