Ответ 1
quotient = 3 / 2;
remainder = 3 % 2;
// now you have them both
Я хочу знать, как получить остаток и quotient в одном значении в Java.
Пример:
3/2 Я должен получить значение как 1.5.
Если я использую оператор /
, я получаю только частное. Если я использую оператор %
, я получаю только остаток. Как получить оба за один раз в одной переменной?
quotient = 3 / 2;
remainder = 3 % 2;
// now you have them both
В вашем примере 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: двойные и Инфраструктуры Java с плавающей запятой для обсуждения float
и double
)
Проверьте это: http://download.oracle.com/javase/1,5.0/docs/api/java/math/BigDecimal.html#divideAndRemainder%28java.math.BigDecimal%29
Вам просто нужно обернуть вашу int или длинную переменную в объект BigDecimal, а затем вызвать метод divideAndRemainder. Возвращенный массив будет содержать частное и остальное (в этом порядке).
Не беспокойтесь об этом. В своем коде просто выполняйте отдельные/и% операции, как вы упоминаете, хотя это может показаться неэффективным. Пусть компилятор JIT беспокоится о объединении этих операций, чтобы получить как фактор, так и остаток в одной машинной инструкции (насколько я помню, как правило, это делает).
Если вы инициализируете оба параметра как float
, вы обязательно получите фактическое разделенное значение.
Например:
float RoomWidth, TileWidth, NumTiles;
RoomWidth = 142;
TileWidth = 8;
NumTiles = RoomWidth/TileWidth;
Ans: 17,75.
int a = 3;
int b = 2;
float c = ((float)a)/b
@рекурсивное решение (принятый ответ) на 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);
}
}
}