2015-10-13 2 views
0
double y1 = 0; 
double y2 = 0; 
double i = 0.025; 
double n = 2; 
double h1 = 2000; 
double h2 = 4000; 

y1 = Math.pow((1 + i), n) * h1; 
y2 = Math.pow((1 + i), n) * h2; 
double result = y1 + y2; 
System.out.println(result); 

Я хочу, чтобы результат был «6303.749999999999», но он дает мне «6303,75». Как я могу это решить?Java Rounding (Double)

+4

Вы _want_ '6303.749999999999'? – Tunaki

+3

Возможный дубликат [Как округлить число до n десятичных знаков в Java] (http://stackoverflow.com/questions/153724/how-to-round-a-number-to-n-decimal-places-in- java) – azurefrog

+0

Разве это не так, как хотелось 0.999999999999 с кодом типа: double a = 1? – ergonaut

ответ

1

правильный результат должен быть (и есть) 6303,75000000000001706967900361178182056891656321977742302336 7655509563911228609889292329171439632773399353027343750000

Попробуйте взглянуть на класс BigDecimal.

BigDecimal i = new BigDecimal(0.025); 
    int n = 2; 
    BigDecimal h1 = new BigDecimal(2000); 
    BigDecimal h2 = new BigDecimal(4000); 

    BigDecimal y1 = ((BigDecimal.ONE.add(i)).pow(n)).multiply(h1); 
    BigDecimal y2 = ((BigDecimal.ONE.add(i)).pow(n)).multiply(h2); 
    BigDecimal result = y1.add(y2); 

    System.out.println(result.toEngineeringString()); 
0

Проблема в том, что вы находитесь , вычисляя значение 6303.75. если вы добавите оператор, в котором вычитаете значение 0.000000000001 из переменной result, тогда вы получите ожидаемое значение 6303.749999999999.

Приведенные ниже изменения кода показано, как вы можете вместо этого вычислить 6303.749999999999:

public static void main(String[] args){ 

    double y1 = 0; 
    double y2 = 0; 
    double i = 0.025; 
    double n = 2; 
    double h1 = 2000; 
    double h2 = 4000; 

    y1 = Math.pow((1 + i), n) * h1; 
    y2 = Math.pow((1 + i), n) * h2; 
    double result = y1 + y2; 
    result -= (double)0.000000000001; // this line is the key to calculating the expected result 
    System.out.println(result); 
} 

Выход:

6303,749999999999