精度损失 - Java

时间:2014-05-24 17:37:42

标签: java floating-point integer double

问题陈述:

写一个方法whatTime,它取一个int,seconds,表示某天某午夜以来的秒数,并返回一个格式为" ::"的字符串。此处表示自午夜起的完整小时数,表示自上一个完整小时结束以来的完整分钟数,并表示自上一个完整分钟结束以来的秒数。每个,,和应该是一个整数,没有额外的前导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.这将产生经过的秒数。
  5. 然而,产生的输出是1:1:0。我尝试使用print语句,看起来' answer3'变量是0.999,这就是打印整数部分(0)的原因。我尝试使用Math.ceil()函数对值进行舍入,并生成正确的输出。但是,当我提交我的代码时,我只能得到大约60/250分(TopCoder SRM 144 Div2)。任何改进算法的见解都会有所帮助。

    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;
    
        }
    }
    

3 个答案:

答案 0 :(得分:3)

避免使用浮点值,并完全使用整数或长整数。

答案 1 :(得分:3)

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;
}

可以更优雅地进行格式化,但这是基本想法。

答案 2 :(得分:0)

你可以通过使用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。这产生了经过的秒数。