Как сохранить десятичную в Java - PullRequest
5 голосов
/ 02 июля 2010

Имея следующий код на Java:

double operation = 890 / 1440;  
System.out.println(operation);  

Результат: 0.0

Я хочу сохранить первые 4 десятичных знака этой операции (0.6180).Вы знаете, как я могу это сделать?

Ответы [ 7 ]

16 голосов
/ 02 июля 2010

Инициализируйте вашу переменную с помощью выражения, которое оценивается как двойное, а не как целое:

double operation = 890.0 / 1440.0;

В противном случае выражение выполняется с использованием целочисленной арифметики (которая заканчивается усечением результата).Этот усеченный результат затем преобразуется в double.

11 голосов
/ 02 июля 2010

Вы можете использовать двойной литерал d - иначе ваши числа считаются типа int:

double operation = 890d / 1440d;

Затем вы можете использовать NumberFormat, чтобы указать количество цифр.

Например:

NumberFormat format = new DecimalFormat("#.####");
System.out.println(format.format(operation));
6 голосов
/ 02 июля 2010

Вы также можете сделать что-то вроде этого:

double result = (double) 890 / 1400;

, который печатает следующее:

0.6180555555555556

Вы можете проверить, как округлитьдо номера здесь

3 голосов
/ 02 июля 2010

Это делается с помощью 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));
        }
    }

выход

операция: 0.6180555555555556 масштабировано: 0,6181

2 голосов
/ 02 июля 2010

BigDecimal, хотя и очень неуклюжий для работы, предоставляет несколько вариантов форматирования:

    BigDecimal first = new BigDecimal(890);
    BigDecimal second = new BigDecimal(1440);
    System.out.println(first.divide(second, new MathContext(4, RoundingMode.HALF_EVEN)));
1 голос
/ 02 июля 2010
double operation = 890.0 / 1440;
System.out.printf(".4f\n", operation);
0 голосов
/ 02 июля 2010

Если вы действительно хотите округлить до первых 4 дробных цифр, вы также можете использовать целочисленную арифметику, сначала умножив первое число, чтобы его цифры были сдвинуты на нужную величину f местами влево:

long fractionalPart = 10000L * 890L / 1440L;

Я использую long здесь, чтобы избежать переполнения в случае, если временный результат не помещается в 32 бита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...