2013-11-18 2 views
4

Я пытаюсь написать программу, которая побуждает пользователя вводить общее количество этажей в отеле, количество комнат на каждом этаже и количество занятых комнат. В конце он должен отображать общее количество комнат, общее количество занятых комнат и процент занимаемых помещений. У меня проблемы с отображением процента занятых комнат. Я использую все числа int.Java: целочисленное разделение округлено вверх

Это уравнение, которое я ставлю:

roomsOccPercentage = (totalRoomsOccupied * 100)/totalRooms ; 

Когда я представляю программу на Java бегуна моего профессора это показывает:

65 % of the Rooms are occupied. 

Но один мой профессор при условии, выводимый в ответ на 66% вместо этого программа не примет мой файл.

Кто-нибудь знает, что я делаю неправильно? Это ошибка DecimalFormat?

Edit: Вот весь код

import java.util.Scanner; 
import java.text.DecimalFormat; 

public class hw7_1 { 
    public static void main(String[]args) { 

     Scanner keyboard = new Scanner(System.in); 
     DecimalFormat formatter = new DecimalFormat("#0"); 
     int totalFloors; 
     int totalRooms = 0; 
     int numFloors; 
     int numRooms; 
     int roomsOccupied; 
     int totalRoomsOccupied = 0; 
     int roomsOccPercentage = 0; 

     //prompting users to input # of floors, no inputs below 1 floor 
     do { 
      System.out.println("Please enter the number of floors in the hotel: "); 
      numFloors = keyboard.nextInt(); 

      if (numFloors < 1) { 
       System.out.println("You have entered an invalid number of floors. "); 
      } 
     } 
     while (numFloors < 1); 

     //for loops on how many rooms on each hotel floors 
     for (int Floors = 1; Floors <= numFloors; Floors++) { 
      if (Floors == 13) { 
       continue; 
      } 

      do { 
       System.out.println("Please enter the number of rooms on floor #: " + Floors); 
       numRooms = keyboard.nextInt(); 

       if (numRooms < 10) { 
        System.out.println("You have entered an invalid number of rooms. "); 
       } 
      } while (numRooms < 10); 

      System.out.println("Please enter the number of occupied rooms on floor #: " + Floors); 
      roomsOccupied = keyboard.nextInt(); 

      totalRooms = totalRooms + numRooms; 
      totalRoomsOccupied = totalRoomsOccupied + roomsOccupied; 
      roomsOccPercentage = (totalRoomsOccupied * 100)/totalRooms ; 
     } 
     System.out.println("\nThe hotel has a total of " + totalRooms + " rooms."); 
     System.out.println(totalRoomsOccupied + " of the rooms are occupied."); 
     System.out.println(formatter.format(roomsOccPercentage) + "% of the rooms are occupied."); 
    } 
} 
+1

Это скорее всего может быть. Вы могли бы попытаться сделать любой из 1 операндов таким образом, чтобы он больше не был целым делением. 'roomsOccPercentage = ((float) totalRoomsOccupied * 100)/totalRooms;' – SudoRahul

+0

@ Комментарий R.J должно решить вашу проблему. –

+0

Дело в том, что мы еще не изучили этот метод в классе. Есть ли способ новичков? –

ответ

5

Вы должны сделать свои roomsOccPercentage двойные первым.

double roomsOccPercentage = 0.0; 

, а затем отбросить любой из операндов, чтобы избежать целочисленного деления.

roomsOccPercentage = (totalRoomsOccupied * 100.0)/totalRooms; 

Вы можете использовать явное приведение типов, как (double)totalRoomsOccupied или просто сделать 100 в 100.0 который является числом с плавающей точкой, что делает разделение тоже, с плавающей точкой, один и не целочисленное деление.

0

Там нет ничего называют округления в целочисленном делении, так как он будет принимать целую часть только в результате деления. используйте double значение для ваших расчетов и используйте Math.round().

13

Обратите внимание, что java играет со своим собственным правилом, вам нужно подчиняться им. Решите, хотите ли вы пол или уровень результата, см. Пример, приведенный ниже.

double roomsOccPercentage; 
roomsOccPercentage =Math.ceil((double)5/4); //will be 2 
roomsOccPercentage =Math.ceil(5/4); //will be 1 
roomsOccPercentage =Math.floor((double)5/4); //will be 1 

Я надеюсь, что теперь вы можете найти Java интересной

+0

спасибо. Да, я искал этот метод. Просто мой класс еще не перешел к этому, поэтому я очень неохотно его использую. Я просто пытаюсь выяснить, пропустил ли я что-нибудь еще. –

0

Heres простой способ округлить:

double dnum; = 47.213; //make this your value to round up 
int inum; //null for now, will be your rounded up integer 
if(dnum > (int)num) 
    inum = (int)(num + 1.0); 
else 
    inum = (int)num; 

Если его уже не целое число, оно добавляет один и бросает его вниз. Если это целое число, оно отличает его как целое число.

1

Учитывая a/b, если вы хотите, чтобы округлить до ближайшего целого числа, вам нужно добавить 1, если остаток составляет половину или более половины б, поэтому:

a/b + a % b/(b/2) 

будет делать трюк.

+0

downvote: disproven in @ user5119722 ответ –

+0

возможно 'a/b + (a% b) * 2/b', таким образом вы не теряете точность в целочисленном делении на 2 –

2

a/b + a % b/(b/2) ??
1 разделить на 3 должно быть 0
1/3 + 1 % 3/(3/2) = 0 + 1/1 = 1 который НЕ является 0

Я рекомендую это:

(a + a % b)/b 
Смежные вопросы