【问题标题】:Loss of precision - Java精度损失 - Java
【发布时间】:2014-07-13 22:00:30
【问题描述】:

问题陈述:

编写一个方法whatTime,它接受一个int,秒,表示从某天午夜开始的秒数,并返回一个格式为“::”的字符串。这里,表示自午夜以来的完整小时数,表示自最后一个完整小时结束以来的完整分钟数,并表示自最后一个完整分钟结束以来的秒数。 、 和 中的每一个都应该是一个整数,没有额外的前导 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;

    }
}

【问题讨论】:

  • 使用long 值而不是double。在几秒钟内做你的减法。并学习如何使用% 余数运算符。

标签: java floating-point integer double


【解决方案1】:

你可以通过使用整数来解决这个问题:

  1. 3661/3600 = 1.016944 -> 这意味着小时数是 1
  2. 减去小时数 * 3600 - 即 3661-(1*3600) = 61
  3. 61/60 = 1.0166666 -> 经过的分钟数等于 1
  4. 减去分钟数 * 60,即 61-(1*60)=1。这会产生经过的秒数。

【讨论】:

  • 如果你正在使用整数,你怎么可能得到 1.016944?
  • @EJP 我的意思是在进行除法之后,您返回包含剩余秒数的 int 值,以便减去属于完整小时或分钟的秒数。当然,如果你把除法的结果放在一个 int 变量中,你的结果就是一个 int。
【解决方案2】:

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

【讨论】:

    【解决方案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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      相关资源
      最近更新 更多