繁体   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