Как разделить, чтобы получить десятичное значение? - PullRequest
23 голосов
/ 20 марта 2009

Я хочу знать, как получить остаток и частное в одном значении в Java.

Пример:

3/2 Я должен получить значение 1,5.

Если я использую оператор /, я получаю только частное. Если я использую оператор %, я получу только остаток. Как получить оба одновременно в одной переменной?

Ответы [ 10 ]

57 голосов
/ 20 марта 2009
quotient = 3 / 2;
remainder = 3 % 2;

// now you have them both
16 голосов
/ 20 марта 2009

В вашем примере Java выполняет integer арифметику, округляя результат деления.

Исходя из вашего вопроса, вы хотели бы выполнить арифметику с плавающей точкой. Для этого по крайней мере один из ваших терминов должен быть указан (или преобразован в) с плавающей точкой:

Указание числа с плавающей запятой:

3.0/2
3.0/2.0
3/2.0

Преобразование в плавающую точку:

int a = 2;
int b = 3;
float q = ((float)a)/b;

или

double q = ((double)a)/b;

(См. Java Traps: double и Java-числа с плавающей запятой для обсуждения float и double)

8 голосов
/ 20 сентября 2011

Проверьте это: http://download.oracle.com/javase/1,5.0/docs/api/java/math/BigDecimal.html#divideAndRemainder%28java.math.BigDecimal%29

Вам просто нужно обернуть переменную int или long в BigDecimal объект, а затем вызвать для него метод divAndRemainder . Возвращенный массив будет содержать частное и остаток (в указанном порядке).

7 голосов
/ 20 марта 2009

Не беспокойся об этом. В вашем коде просто делайте отдельные операции / и%, как вы упоминаете, даже если это может показаться неэффективным. Пусть компилятор JIT беспокоится о том, чтобы объединить эти операции, чтобы получить как частное, так и остаточное значение в одной машинной инструкции (насколько я помню, обычно).

1 голос
/ 28 февраля 2019

Вы можете сделать как,

int a = 3;
int b = 2;
int quotient = a / b;
int remainder = a % b;

Чтобы получить частное в действительных числах

System.out.println((double) a / b);

Чтобы получить частное в целых числах

System.out.println("Quotient: " + quotient);
System.out.println("Remainder: " + remainder);

Чтобы получить частное в вещественном числе, такое что одно число после десятичного числа

System.out.println(a / b + "." + a % b * 10 / b);

Примечание: в последнем методе он не округляет число после десятичной дроби.

1 голос
/ 15 марта 2017
int a = 3;
int b = 2;
float c = ((float)a)/b
1 голос
/ 22 апреля 2014

Если вы инициализируете оба параметра как float, вы обязательно получите действительное разделенное значение. Например:

float RoomWidth, TileWidth, NumTiles;
RoomWidth = 142;
TileWidth = 8;
NumTiles = RoomWidth/TileWidth;

Ans: 17.75

.
0 голосов
/ 28 февраля 2019

Я имею в виду, это довольно просто. Установите это как двойной. Так скажем

double answer = 3.0/2.0;
System.out.print(answer);
0 голосов
/ 13 апреля 2018

Пожалуйста, преобразуйте ваши данные в двойные и разделите.

0 голосов
/ 22 ноября 2017

@ рекурсивное решение (принятый ответ) на 100% верно. Я просто добавляю пример кода для вашей справки.

Мой случай - отобразить цену с двумя десятичными цифрами. Это часть внутреннего ответа: "price": 2300, "currencySymbol": "CD", ....

Это мой вспомогательный класс:

public class CurrencyUtils
{
    private static final String[] suffix = { "", "K", "M" };

    public static String getCompactStringForDisplay(final int amount)
    {
        int suffixIndex;
        if (amount >= 1_000_000) {
            suffixIndex = 2;
        } else if (amount >= 1_000) {
            suffixIndex = 1;
        } else {
            suffixIndex = 0;
        }

        int quotient;
        int remainder;
        if (amount >= 1_000_000) {
            quotient = amount / 1_000_000;
            remainder = amount % 1_000_000;
        } else if (amount >= 1_000) {
            quotient = amount / 1_000;
            remainder = amount % 1_000;
        } else {
            return String.valueOf(amount);
        }

        if (remainder == 0) {
            return String.valueOf(quotient) + suffix[suffixIndex];
        }

        // Keep two most significant digits
        if (remainder >= 10_000) {
            remainder /= 10_000;
        } else if (remainder >= 1_000) {
            remainder /= 1_000;
        } else if (remainder >= 100) {
            remainder /= 10;
        }

        return String.valueOf(quotient) + '.' + String.valueOf(remainder) + suffix[suffixIndex];
    }
}

Это мой тестовый класс (основанный на Junit 4):

public class CurrencyUtilsTest {

    @Test
    public void getCompactStringForDisplay() throws Exception {
        int[] numbers = {0, 5, 999, 1_000, 5_821, 10_500, 101_800, 2_000_000, 7_800_000, 92_150_000, 123_200_000, 9_999_999};
        String[] expected = {"0", "5", "999", "1K", "5.82K", "10.50K", "101.80K", "2M", "7.80M", "92.15M", "123.20M", "9.99M"};

        for (int i = 0; i < numbers.length; i++) {
            int n = numbers[i];
            String formatted = CurrencyUtils.getCompactStringForDisplay(n);
            System.out.println(n + " => " + formatted);

            assertEquals(expected[i], formatted);
        }
    }

}
...