Почему мои переменные, содержащие целые числа с плавающей запятой? - PullRequest
0 голосов
/ 23 сентября 2011

Я уже некоторое время смотрю на этот код, и я не могу понять, что, вероятно, является простой ошибкой ... Короче, у меня есть переменная типа float в Java, которая, кажется, хранит толькоцелочисленное содержимое (целое число) того, что значение фактически должно быть.Этот фрагмент кода работал раньше, когда все было объединено в одну функцию, но после того, как я переформировал код для использования большего количества функций, произошла эта ошибка.Вот что я получил до сих пор:

Java Code

public class ModifyTimeController extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        PopulateTimeIntervals(request.getWriter());
    }
    protected void PopulateTimeIntervals(PrintWriter writer) {
        NumberFormat numberFormat = NumberFormat.getNumberInstance();
        numberFormat.setMinimumFractionDigits(2);
        numberFormat.setMaximumFractionDigits(2);
        float workHours = (float)0.00;

        ...
        /* Code that queries a database for TimeIntervals */
        ...

        while(resultSet.next()) {
            // I was told that this type of conversion is
            // possible since Timestamp is an extension of Date
            Date dtStart = resultSet.getTimestamp("dtStart");
            Date dtEnd = resultSet.getTimestamp("dtEnd");

            // Accumulates the hours worked in each time interval
            workHours += CalculateWorkHours(dtStart, dtEnd);
        }
        // Should print out something like: 54.27
        writer.println(numberFormat.format(workHours).toString());
    }

    protected float CalculateWorkHours(Date dtStart, Date dtEnd) {
        // Divides the difference of the start and end times 
        // (in miliseconds) by 3600000 to convert to hours
        return (dtEnd.getTime() - dtStart.getTime()) / 3600000;
    }
}

Это был долгий день, поэтому я, наверное, просто что-то упустил ... Но вместо того, чтобы распечатывать что-то вроде54.27 часов, я получаю квартиру 54 часов.Форматирование чисел работало просто отлично, до того ... Так что я не знаю, что случилось.

Ответы [ 2 ]

4 голосов
/ 23 сентября 2011

На return (dtEnd.getTime() - dtStart.getTime()) / 3600000; вы делите на целое число и делаете ответ целым числом.Измените его на 3600000.0 (или 3600000f), и вы должны быть золотыми.

2 голосов
/ 23 сентября 2011
dtEnd.getTime() - dtStart.getTime()) / 3600000

Это деление на long и int, поэтому сам результат будет long и затем будет приведен к float, который будет содержать только вычисленное значение long. Чтобы получить результат с плавающей точкой, сначала используйте один из операндов с плавающей точкой, либо используйте вместо него литерал с плавающей точкой, например 3600000f.

...