2010-07-02 5 views
3

Имея следующий код в Java:Как сохранить десятичное в Java

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

Результат: 0,0

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

+1

где вы хотите его «сохранить»? – Bozho

+0

Операции с числами с плавающей запятой (float или double) не дают точного результата, что делает их непригодными для любого финансового расчета, который требует точного результата, а не приближения. Вместо этого используйте BigDecimal. –

ответ

14

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

double operation = 890.0/1440.0; 

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

+0

Хотя это довольно, может быть целесообразно вместо этого (или также) явно использовать оба числа для удвоения.Причина в том, что если кто-то (даже позже OP) приходит позже и изменяет числа, они могут забыть добавить десятичные знаки, и функциональность таинственно сломается. – Cam

+0

Я согласен, решение 123d Bozho предпочтительнее, чем цель. –

+0

Одна из многих ошибок. Я лично хочу оставить небольшой комментарий в этом случае. Что-то вроде: «Должны использоваться двойные литералы. Целочисленные литералы приведут к целочисленной арифметике». Это всегда напоминание, почему это так. – f470071

7

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

double operation = 890d/1440d; 

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

Например:

NumberFormat format = new DecimalFormat("#.####"); 
System.out.println(format.format(operation)); 
+0

Позволяет ли NumberFormat сохранять четыре десятичные цифры в переменной или отображать только первые десятичные цифры «X»? – Eric

+2

NumberFormat влияет только на презентацию, переменная 'operation' не влияет – Kennet

+0

@ Kennet ok, thanks :) – Eric

2

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

5

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

double result = (double) 890/1400; 

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

0,6180555555555556

Вы можете проверить, как округлить число here

+1

Просто помните, что вы не бросаете (890/1440), чтобы удвоить это. Вы бросаете 890, чтобы удвоить это. А операция (double/int) возвращает double. – corsiKa

+0

Да. Но я думаю, что этот метод немного лучше, так как он также работает, когда у вас есть двойные переменные, а не жестко закодированные, по крайней мере, в C#, который я использовал, чтобы испытать ту же проблему и исправил ее, как указано выше. – npinti

2

BigDecimal, хотя и очень топорно работать, дает некоторое форматирование варианты:

BigDecimal first = new BigDecimal(890); 
    BigDecimal second = new BigDecimal(1440); 
    System.out.println(first.divide(second, new MathContext(4, RoundingMode.HALF_EVEN))); 
0

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

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

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

0
double operation = 890.0/1440; 
System.out.printf(".4f\n", operation); 
Смежные вопросы