-1

Я пытался из вычитания чисел в Java, и это дает мне неожиданный результатКак использовать дважды, чтобы получить ожидаемый результат

public class FloatWeird 
{ 
    public static void main(String[] args) 
    { 
     double n = 1; 

     for(int i = 0;i<10;i++) 
     { 
      System.out.println(n); 
      n = n - 0.10; 
     } 

    } 
} 

Результат

1.0 
0.9 
0.8 
0.7000000000000001 
0.6000000000000001 
0.5000000000000001 
0.40000000000000013 
0.30000000000000016 
0.20000000000000015 
0.10000000000000014 

Я прошел через несколько форумов и понять, что использование класса BigDecimal является одним из решений. Однако есть ли способ исправить это проще, используя double, как указано выше?

+0

Что представляют собой эти цифры? Предположим, что они представляют собой количество джина, которое нужно использовать для приготовления коктейля. Действительно ли это имеет значение, если вы добавите миллионную часть миллиарда литра больше, чем нужно? –

+0

IMHO Это не дубликат, поскольку OP конкретно заявляет, что им известно об альтернативе использования BigDecimal. –

ответ

0

Я предлагаю вам использовать соответствующее округление.

System.out.printf("%.1f%n", n); 

Когда вы печатаете двойной, вы должны рассмотреть, что такое соответствующий раунд.

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

n = n - 0.10; 
n = Math.round(n * 10)/10.0; 

Это уменьшит кумулятивную ошибку.

Другой подход заключается в работе в другом блоке, например. вместо доллара вы используете центы. Это означает, что вы можете использовать int или long и конвертировать только в доллары для презентации.

long n = 100; 
for(int i = 0; i < 10; i++) { 
    System.out.println(n/100.0); 
    n = n - 10; 
} 

печатается http://ideone.com/Uf70jC

1.0 
0.9 
0.8 
0.7 
0.6 
0.5 
0.4 
0.3 
0.2 
0.1 

Примечание: даже если вы используете BigDecimal, это все равно придется сделать это, кроме API может помочь вам определить, в какой момент вы должны сделать это.

+1

https://www.youtube.com/watch?v=PZRI1IfStY0 http://floating-point-gui.de/basic/ –