簡體   English   中英

精度損失-Java

[英]Loss of precision - Java

問題陳述:

編寫方法whatTime,該方法需要一個整數秒(代表某天午夜以來的秒數),並返回一個格式為“ ::”的String。 此處,代表自午夜以來的完整小時數,代表自上一個完整小時結束以來的完整分鍾數,並代表自上一個完整分鍾結束以來的秒數。 ,,和中的每個都應為整數,且沒有多余的前導0。 因此,如果秒為0,則應返回“ 0:0:0”,而如果秒為3661,則應返回“ 1:1:1”

我的算法:

這是我的算法應該對輸入3661起作用的方式:

  1. 3661/3600 = 1.016944->這意味着小時數是1
  2. 減去經過的總小時數,即1.016944-1 = 0.016944
  3. 將此乘以60即0.016944 * 60 = 1.016666->經過的分鍾數等於1
  4. 減去經過的總分鍾數,即1.01666-1 = 0.01666。 將此乘以60。這將產生經過的秒數。

但是,產生的輸出是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來解決此問題:

  1. 3661/3600 = 1.016944->這意味着小時數是1
  2. 減去小時數* 3600-即3661-(1 * 3600)= 61
  3. 61/60 = 1.0166666->經過的分鍾數等於1
  4. 減去分鍾數* 60,即61-(1 * 60)= 1。 這樣得出經過的秒數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM