2016-09-02 8 views
2

Я использую все время BigDecimal по ценам, но мне было интересно, что это лучший способ показать это пользователю.BigDecimal round: doubleValue() vs setScale (2, BigDecimal.ROUND_HALF_UP) в значениях цены

  • Использует doubleValue() хороший способ?
  • Существуют ли различия между этими двумя вариантами?
+2

Использование 'doubleValue()' определенно * не * хороший способ. Вы никогда не должны никогда больше использовать деньги с плавающей запятой. Вы должны использовать 'DecimalFormat' и друзей. – EJP

ответ

0

Использует doubleValue() хороший способ?

Использование BigDecimal имеет смысл, если вы хотите избежать использования double (или вы хотите контролировать, как форматируются ваши номера). Если вы смешиваете BigDecimal и double, я не вижу смысла. Вы также можете использовать double все время и упростить свой код.

Если вы хотите повернуть значение в строку, используйте toString, например.

BigDecimal bd = ... 
System.out.println("bd: " + bd.toString()); 

или просто

System.out.println("bd: " + bd); 

Если вы хотите использовать double вы можете сделать

double d = 
System.out.printf("%.2f%n", d); // round to 2 decimal places 

пример того, почему BigDecimal могут быть более подвержены ошибкам, которые удваиваются. Оба эти ответы являются неправильными, но в случае BigDecimal это не очевидно, либо в коде или результат, который выглядит отлично

System.out.println(BigDecimal.valueOf(1.00) 
          .divide(BigDecimal.valueOf(49), 2, BigDecimal.ROUND_HALF_UP) 
          .multiply(BigDecimal.valueOf(49))); 
System.out.println(1.00/49 * 49); 

печатает

0.98 
0.9999999999999999 

Вы можете исправить и код, но тот факт, проблема в первом случае легко пропущена. Подсказка: использование BigDecimal.valueOf не является проблемой. Чем более подробный код (чем больше символов вы используете), тем сложнее увидеть важные детали.

+0

Я понимаю, что смешивание двух типов не имеет смысла, но я выполняю несколько операций со значением, поэтому я хочу сохранить BigDecimal для этих операций, но с точки зрения отображения цены для пользователя есть ли разница? Я хочу напечатать значение цены только двумя десятичными знаками, равно как и обычный способ показать цены – ZetaPR

+0

@MrGracket см. Мой обновленный ответ. Вы также можете использовать 'double', но для согласованности я бы использовал один или другой. Если использование «double» подходит для ответа, скорее всего, вам никогда не понадобится BigDecimal. –

+1

Я не могу согласиться с заявлением, в котором говорится, что вы можете использовать 'double' (или' float') за деньги. – EJP

1

Я предлагаю пользователю setScale (2, BigDecimal.ROUND_HALF_UP) .toPlainString() пользователю.