Лучший способ в Java конвертировать двойной (представляющий цену) в длинный с ценовой шкалой 8 - PullRequest
1 голос
/ 06 апреля 2020

В коде Java, где для представления цены используется двойное число, как лучше всего преобразовать двойное в длинное с ценовой шкалой 8? Например, {Double} 17.99 преобразуется в {Long} 1799000000. Двойной код может содержать от 2 до 4 десятичных знаков.

Простой код, такой как следующий, иногда работает правильно:

 Double dprice = 17.99;
 Long lprice = (long) (dprice * 100000000);

Однако по известным причинам ( руководство с плавающей запятой ) это может привести к неожиданному результату. Например, в одном тесте {Double} 17.99 преобразуется в {Long} 1798999999.

Каковы наилучшие варианты в Java для безопасного выполнения этого преобразования? Нужен ли BigDecimal в этом случае?

1 Ответ

2 голосов
/ 06 апреля 2020

Чтобы сохранить точность, как указал Энди Тернер в комментариях, вы должны использовать BigDecimal s при умножении, et c, до самого конца. Должно работать следующее:

import java.math.BigDecimal;
import java.math.RoundingMode;

class Main {
  public static void main(String[] args) {
    BigDecimal dprice = BigDecimal.valueOf(17.99).setScale(2, RoundingMode.HALF_UP);
    Long lprice = dprice.multiply(BigDecimal.valueOf(100000000)).longValue();
    System.out.println(lprice);
  }
}

Вызов setScale может использоваться для установки точного количества десятичных цифр, которое вы хотели бы сохранить.

...