将浮点数转换为年,月,周,日

时间:2015-02-25 12:18:14

标签: java

我一直在尝试将浮点数转换为年,月,周,日,小时,分钟和秒,但我没有得到它。

例如,如果用户输入768.96,则总计为2年,1个月,1周,1天,23小时,0分钟和2秒。

这就是我所拥有的。

import javax.swing.JOptionPane;

public class timePartition {

public static void main(String[] args) {

   float totalTime;
   float userInput;
   int years = 0, months = 0, weeks = 0, days = 0, hours = 0, minutes = 0, seconds = 0;


   do{
       userInput = Float.parseFloat(JOptionPane.showInputDialog("Enter a positive number to decompose")); 
       totalTime = userInput;

       years = (int) userInput / 365;
       userInput = userInput % 10; 

       months = (int) userInput / 12;
       userInput = userInput % 10; 

       weeks = (int) userInput / 4;
       userInput = userInput % 10;

       days = (int) userInput / 30;
       userInput = userInput % 10;

       hours = (int) userInput / 24;
       userInput = userInput % 10;

       minutes = (int) userInput / 60;
       userInput = userInput % 10;

       seconds = (int) userInput / 60;
       userInput = userInput % 10;


    }while (userInput >=1);

    System.out.print("The number " +totalTime+ " is " +years+ " years, " +months+ " months, " +weeks+ " weeks, " +days+ " days, " +hours+ " hours, " +minutes+ " minutes, " +seconds+ " seconds.");


}

3 个答案:

答案 0 :(得分:1)

我不认为你拿出每个面额后可以使用模10来减少输入。此外,您根本不需要while循环。

您必须执行类似

的操作
years = (int) (userInput / 365);
userInput = userInput - years*365;

等等。此外,由于输入是在几天内,你必须在你分手的几天内继续思考,所以除以12得到月数是没有意义的。相反,你需要将剩余的天数乘以24,然后取小时的小部分并将其分解为几分钟和几秒钟。

答案 1 :(得分:0)

我想输入是在白天 你的代码中有一些奇怪的东西:

  • 不需要while循环
  • (int) userInput会在分区前的int中投放userInput,这里不是很重要,但要小心;)
  • userInput % 10到处都是
  • 除以12得到月数,得到4得到周数,依此类推

以下是解决方案的框架:

float userInput /* = ... */ ;

int years = (int)(userInput/365) ;
userInput = userInput - years*365 ; // or userInput%365 ;

int month = (int)(userInput/30);
userInput = userInput - month*30 ; // or userInput%30 ;

int day = (int) userInput ;
userInput = userInput - day ;

userInput = userInput * 24 ; //transform in hours

int hours = (int)hours ;
userInput = userInput - hours ;

userInput = userInput * 60 ; // transform in minute

int minutes = (int)userInput ;
userInput = userInput - minutes ;

userInput = userInput * 60 ; // transform in second

int seconds = (int) userInput ;

答案 2 :(得分:0)

好的,这里有几件事:

  • 只是为了确保你知道:日期/时间算术并不像看起来那么简单。有几个字段持续时间均匀,包括年份(由于某些年份的闰年而不是其他年份),几个月(28-31天,取决于月份),甚至几分钟(由于罕见但是严格必要的闰秒)。这意味着从技术上讲,您无法将总持续时间计数(例如" x天")正确分解为持续时间字段,反之亦然(至少在没有一些"锚定"日期/时间点)。
  • 如果您想做出错误的假设,例如"所有年份都有365天"并且"所有月份都有30天#34;和#34;所有分钟都有60秒"那么这可以做到。
  • 我不确定您是否希望程序采用并分解单个值,在这种情况下,循环不是必需的,或者是多个值,在这种情况下,最终的print语句应该在循环内。我已经假设了后者。
  • 根据您的示例输入和分解代码的开头,您似乎希望输入浮点值的整数部分表示天数,小数部分表示时间值为一天的分数。根据这种解释,您的分解代码是不正确的;首先必须将ipart和fpart分开以独立分解,并且在分解的每个步骤中,必须将剩余部分取为前一个字段持续时间大小(例如,一周7天,一小时3600秒),而不是固定的值10(不确定来自哪里......)为下一步的分解做准备。这可以使用mod-assign运算符%=完成。

此处的工作代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class TimePartition {

    public static void main(String[] args) throws Exception {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true) {

            System.out.println("Enter a positive number to decompose");
            String input = br.readLine();
            if (input.equals("")) break;
            float inputAsFloat = Float.parseFloat(input);
            if (inputAsFloat == 0.0) break;

            // the input is an integral day count, with a possible fractional part representing time as a fraction of one day
            int totalDays = (int)inputAsFloat;
            int totalSeconds = (int)((inputAsFloat-totalDays)*60.0*60.0*24.0);

            // decompose totalDays into date fields
            int years = 0;
            int months = 0;
            int weeks = 0;
            int days = 0;

            // ignores leap years
            years = (int)totalDays/365;
            totalDays %= 365;

            // assumes all months have 30 days
            months = (int)totalDays/30;
            totalDays %= 30;

            weeks = (int)totalDays/7;
            totalDays %= 7;

            days = (int)totalDays;

            // decompose totalSeconds into time fields
            int hours = 0;
            int minutes = 0;
            int seconds = 0;

            hours = (int)totalSeconds/3600;
            totalSeconds %= 3600;

            // ignores leap seconds
            minutes = (int)totalSeconds/60;
            totalSeconds %= 60;

            seconds = (int)totalSeconds;

            System.out.println("The number "+inputAsFloat+" is "+years+" years, "+months+" months, "+weeks+" weeks, "+days+" days, "+hours+" hours, "+minutes+" minutes, "+seconds+" seconds.");

        } // end while

    } // end main()

} // end class TimePartition

演示:

bash> ls
TimePartition.java

bash> javac TimePartition.java

bash> ls
TimePartition.class*  TimePartition.java

bash> CLASSPATH=. java TimePartition
Enter a positive number to decompose
768.96
The number 768.96 is 2 years, 1 months, 1 weeks, 1 days, 23 hours, 2 minutes, 25 seconds.