2012-06-24 2 views
7

Я думаю использовать BigDecimal для сравнения двух значений валюты, округленных до двух цифр. Например, я ожидаю, что следующее значение получится 0, потому что я сравниваю то, что должно округлить до 0,02 с чем-то, равным 0,02. Но это дает -1 !! Есть ли правильный способ сделать это?BigDecimal в Java

Это также должно работать для больших чисел, таких как 123.45 против 123.4534 ... которое должно давать 0, когда используется «compareTo».

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

BigDecimal spread = new BigDecimal(0.01934); 
spread.setScale(2, RoundingMode.HALF_EVEN); 
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(new BigDecimal(0.02))); 

и раствор:

BigDecimal spread = new BigDecimal(0.01934).setScale(2, RoundingMode.HALF_EVEN); 
BigDecimal loSpread = new BigDecimal(0.02).setScale(2, RoundingMode.HALF_EVEN); 
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(loSpread)); 

ответ

5

0,02 получает оценку в

java.math.BigDecimal = 0.0200000000000000004163336342344337026588618755340576171875 

Вы должны setScale (2, RoundingMode.HALF_EVEN) там тоже.

+0

Это еще один способ получить точный номер с плавающей запятой. 1+. –

+0

Придется использовать обе идеи здесь, чтобы понять это правильно. Будет опубликован правильный код. – fodon

10

Во-первых, BigDecimal неизменна. Вы должны вернуть результат от вашего setScale вызова метода:

spread = spread.setScale(2, RoundingMode.HALF_EVEN); 

Далее вы должны улучшить вашу точность второго BigDecimal, так как он является производной от двойной - не очень точной сущности. Так что попробуйте строку:

spread.compareTo(new BigDecimal("0.02")) 
+0

Это действительно используется, чтобы сравнить цены. Возможно, они должны быть созданы из двойников. – fodon

+0

@fodon: Тогда пользователь неизвестен имеет часть вашего ответа для вас, и у меня есть другая часть (в отношении BigDecimal является неизменной). –

+1

Я вернул неверное изменение. Люди, пожалуйста, _comment_ или укажите _additional answer_, если вас не устраивает ответ, который вы видите. –