2016-03-10 4 views
1

1.Десятичная точность вопроса | Большой Десятичный

BigDecimal ap = new BigDecimal(170.8999999999998, MathContext.DECIMAL64).setScale(2, BigDecimal.ROUND_FLOOR); 

Результат: 170,89 (Требуется: 170,89)

2.

BigDecimal ap = new BigDecimal(170.89999999999998, MathContext.DECIMAL64).setScale(2, BigDecimal.ROUND_FLOOR); (1 Extra 9 in value) 

Результат: 170,90 (Требуется: 170,89)

3.

BigDecimal ap = new BigDecimal(2401.99).setScale(2, BigDecimal.ROUND_FLOOR); 

результат: 2401.98 (обязательно: 2401.99)

Как получить только 2 цифры после десятичной дробной величины без округления.

P.S: Я не хочу преобразовывать значение в String.

+3

Поместите это число в кавычки, чтобы передать его строковое представление в BigDecimal. В настоящее время вы используете двойной литерал с ошибкой округления во время компиляции. –

ответ

4

2401.99 является doubleбуквально, с фактическим значением чуть ниже этого.

Используйте конструктор BigDecimal вместо String.

+0

поэтому '2401.99' на самом деле что-то вроде' 2401.9888888888888887', а '170.89999999999998' на самом деле smth, как' 170.90000000000000003' –

+0

@SashaSalauyou: да, вы правы. –

+0

Ближайший двойной к 2401.99 - 2401.989999999999781721271574497222900390625, ближайший двойной к 170.89999999999998 - 170.8999999999999772626324556767940521240234375. Частью проблемы является использование ROUND_FLOOR, а не, например, ROUND_HALF_EVEN, но реальное исправление заключается в том, чтобы избежать двойного преобразования. –

Смежные вопросы