2009-03-20 2 views
21

Я хочу знать, как получить остаток и частное значение в одном значении в Java.Как я делю, чтобы получить десятичное значение?

Пример:

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

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

ответ

15

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

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

Задание с плавающей точкой:

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 Floating-Point Number Intricacies для обсуждения float и double)

55
quotient = 3/2; 
remainder = 3 % 2; 

// now you have them both 
+0

в Java это не будет работать, если вы делаете 1,0% 0,1 – endless

+2

@endless: Верно, вам придется сначала преобразовать в целое число. И вам также нужно будет указать, что вы подразумеваете под остальными двумя поплавками, поскольку он обычно определяется в терминах целочисленной арифметики. – recursive

+0

Просто, если кто-то обсудит этот вопрос и задается вопросом, как вы получите не частное, а самое большое натуральное число <= фактор или мода, вы можете использовать эту функцию в математическом пакете: 'Math.floorDiv (x, y)' и 'Math.floorMod (x, y)' –

7

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

8

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

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

+0

удивительное предложение. – Buffalo

+0

Это отличный ответ, что он отвечает тем, что ищет OP. Нужно спросить, хотя отказ от использования 32-битного примитива для BigDecimal противодействует любой экономии, которую теоретически можно получить (если компилятор не выполнил оптимизацию для вас)? – demongolem

1

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

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

Ответ: 17.75.

1
int a = 3; 
int b = 2; 
float c = ((float)a)/b 
+0

Вы можете улучшить этот ответ, кратко описав, что делает ваш код. Например, почему необходимо преобразовать a в float перед делением. –

+0

Это сработало. благодаря – JITHIN

0

@ solusion рекурсивного в (Принятый ответ) составляет 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); 
     } 
    } 

} 
Смежные вопросы