web-dev-qa-db-ja.com

Java:整数除算の切り上げ

ホテルの総階数、各階の部屋数、占有部屋数を入力するように促すプログラムを作成しようとしています。最終的には、部屋の総数、占有されている部屋の総数、および占有されている部屋の割合が表示されます。部屋の占有率の表示に問題があります。私はすべての整数を使用しています。

これは私が置いた方程式です:

roomsOccPercentage = (totalRoomsOccupied * 100) / totalRooms ;

プログラムを教授のJavaランナーに送信すると、次のように表示されます。

65 % of the Rooms are occupied.

しかし、私の教授が提供したものは、代わりに66%の回答を出力したため、プログラムは私のファイルを受け入れません。

誰かが私が間違っていることを知っていますか? DecimalFormatエラーですか?

編集:これがコード全体です

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.");
    }
}
4
Sam Young

最初にroomsOccPercentageをdoubleにする必要があります。

double roomsOccPercentage = 0.0;

次に、いずれかのオペランドをキャストするため、整数の除算は避けてください。

roomsOccPercentage = (totalRoomsOccupied * 100.0) / totalRooms;

(double)totalRoomsOccupiedのような明示的なキャストを使用するか、100を浮動小数点数である100.0として作成して、除算も浮動小数点1にし、整数除算ではないようにすることができます。

6
SudoRahul

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 intrestingを見つけることができるといいのですが

17
surya

a / b + a % b / (b/2) ??
1を3で割ると0になります
1 / 3 + 1 % 3 / (3/2) = 0 + 1 / 1 = 1これは0ではありません

私はこれをお勧めします:

(a + a % b) / b
1
user5119722

与えられたa/b、最も近い整数に丸めたい場合、余りがbの半分または半分より多い場合は、1を加算する必要があります。したがって、次のようになります。

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

トリックを行います。

0

切り上げる整数除算を行うためにdoubleに入る場合は、それを行うことができます。したくない場合は、そうする必要はありません。ほんの少し注意が必要です。

private static int divideRoundUp(int denominator, int divisor) {
    return (denominator + divisor - 1) / divisor;
}

試してみよう:

    System.out.println(divideRoundUp(196, 3));
    System.out.println(divideRoundUp(197, 3));
    System.out.println(divideRoundUp(118, 2));
    System.out.println(divideRoundUp(119, 2));

これは印刷します:

66
66
59
60

118/2のように余りがない場合は、通常の結果が得られます。それ以外の場合、結果は切り上げられます。ただし、負の分母や除数を処理する方法は、読者の練習問題として残されています。

学校では、65.5以上を66に切り上げる必要があるのに対し、65.0〜65.5の数値は65に切り下げる必要があることを多くの人が学びました。これが必要な場合、方法は少し異なります。

private static int divideRoundHalfUp(int denominator, int divisor) {
    return (denominator + divisor / 2) / divisor;
}

デモンストレーション:

    System.out.println(divideRoundHalfUp(196, 3));
    System.out.println(divideRoundHalfUp(197, 3));
    System.out.println(divideRoundHalfUp(118, 2));
    System.out.println(divideRoundHalfUp(119, 2));

出力:

65
66
59
60
0
Ole V.V.

切り上げる簡単な方法は次のとおりです。

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;

まだ整数でない場合は、整数を追加してキャストします。整数の場合は、整数としてキャストします。

0
abrahimladha

整数分割は除算結果でのみ整数部分を取るため、整数除算では丸めと呼ばれるものはありません。計算にはdouble値を使用し、Math.round()を使用します。