精度损失-Java

精度损失-Java,java,floating-point,integer,double,Java,Floating Point,Integer,Double,问题陈述: 编写一个方法whatTime,它接受一个int,seconds,表示从某一天午夜开始的秒数,并返回一个格式为“:”的字符串。此处,表示自午夜以来的完整小时数,表示自上一完整小时结束后的完整分钟数,以及自上一完整分钟结束后的秒数。和的每一个都应该是一个整数,没有额外的前导0。因此,如果秒为0,则应返回“0:0:0”,而如果秒为3661,则应返回“1:1:1” 我的算法: 以下是我的算法对输入3661的工作原理: 3661/3600=1.016944->这意味着小时数为1 减去经过的总小

问题陈述:

编写一个方法whatTime,它接受一个int,seconds,表示从某一天午夜开始的秒数,并返回一个格式为“:”的字符串。此处,表示自午夜以来的完整小时数,表示自上一完整小时结束后的完整分钟数,以及自上一完整分钟结束后的秒数。和的每一个都应该是一个整数,没有额外的前导0。因此,如果秒为0,则应返回“0:0:0”,而如果秒为3661,则应返回“1:1:1”

我的算法:

以下是我的算法对输入3661的工作原理:

  • 3661/3600=1.016944->这意味着小时数为1
  • 减去经过的总小时数,即1.016944-1=0.016944
  • 将其乘以60,即0.016944*60=1.016666->经过的分钟数等于1
  • 减去经过的总分钟数,即1.01666-1=0.01666。把这个乘以60。这将产生经过的秒数
  • 然而,产生的输出是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;
    
        }
    }
    

    您可以通过使用ints解决此问题:

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

  • 您可以通过使用ints解决此问题:

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

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

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

    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;
    }
    
    可以更优雅地格式化,但这是基本的想法


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

    使用
    long
    值,而不是
    double
    。用几秒钟做减法。并学习如何使用
    %
    余数运算符。使用
    long
    值而不是
    double
    。用几秒钟做减法。并学习如何使用
    %
    余数运算符。如果你使用整数,你怎么可能得到1.016944?@EJP我的意思是,在除法后,你返回包含剩余秒数的整数值,以减去属于整小时或整分钟的秒数。当然,如果你把除法的结果放在一个int变量中,你的结果将是一个int。如果你在使用int,你怎么可能得到1.016944?@EJP我的意思是除法之后,返回包含剩余秒数的int值,以减去属于整小时或整分钟的秒数。当然,如果你把除法的结果放在一个int变量中,你的结果将是一个int。