Наличие следующего кода в Java:
double operation = 890 / 1440;
System.out.println(operation);
Результат: 0.0
То, что я хочу, должно сохранить первые 4 десятичных цифры этой операции (0.6180). Вы знаете, как я могу сделать это?
Инициализируйте вашу переменную с помощью выражения, которое принимает значение типа double, а не int:
double operation = 890.0 / 1440.0;
В противном случае выражение выполняется с использованием целочисленной арифметики (что приводит к усечению результата). Этот усеченный результат затем преобразуется в double
.
Вы можете использовать двойной литерал d
- в противном случае ваши числа считаются типом int
:
double operation = 890d / 1440d;
Затем вы можете использовать NumberFormat
для указания количества цифр.
Например:
NumberFormat format = new DecimalFormat("#.####");
System.out.println(format.format(operation));
Вы также можете сделать что-то вроде этого:
double result = (double) 890 / 1400;
, который напечатает следующее:
0.6180555555555556
Вы можете проверить, как округлить число здесь
Это сделано с помощью BigDecimal
import java.math.BigDecimal;
import java.math.RoundingMode;
public class DecimalTest {
/**
* @param args
*/
public static void main(String[] args) {
double operation = 890.0 / 1440.0;
BigDecimal big = new BigDecimal(operation);
big = big.setScale(4, RoundingMode.HALF_UP);
double d2 = big.doubleValue();
System.out.println(String.format("operation : %s", operation));
System.out.println(String.format("scaled : %s", d2));
}
}
Output
операция : 0.61805555555556 масштабирование : 0.6181
BigDecimal, хотя и очень неуклюжий в работе, дает некоторые возможности форматирования:
BigDecimal first = new BigDecimal(890);
BigDecimal second = new BigDecimal(1440);
System.out.println(first.divide(second, new MathContext(4, RoundingMode.HALF_EVEN)));
double operation = 890.0 / 1440;
System.out.printf(".4f\n", operation);
Если вы действительно хотите округлить до первых 4 дробных цифр, вы также можете использовать целочисленную арифметику, сначала умножив первое число так, чтобы его цифры были сдвинуты на нужное количество f мест влево:
long fractionalPart = 10000L * 890L / 1440L;
Я использую здесь long, чтобы избежать переполнения в случае, если временный результат не поместится в 32 бита.