2015-01-21 4 views
0
public class Test { 
    public static void main(String[] args){ 
     System.out.println(new BigDecimal(58.34)); 
    } 
} 

Если я запускаю выше данной программы в Java, это дает мне выход, как: 58.340000000000003410605131648480892181396484375поведение BigDecimal в Java

Почему это?

ответ

2

I thi nk BigDecimal.java лучше всего объясняет эту функцию.

API Сая

Переводит двойной в BigDecimal, который является точным десятичной представления двоичного значения дубля с плавающей точкой. Масштаб возвращаемого BigDecimal является наименьшим значением, так что (10scale × val) является целым числом.

Примечание:

Результаты этого конструктора могут быть несколько непредсказуемыми. Один можно предположить, что писать новый BigDecimal (0.1) в Java создает BigDecimal, который в точности равен 0,1 (немасштабированное значение 1, с масштабом 1), но это на самом деле равно 0.1000000000000000055511151231257827021181583404541015625. Это связано с тем, что 0,1 не может быть представлено точно как двойное (или для этого вещество, как двоичная доля любой конечной длины). Таким образом, значение , которое передается конструктору, не точно равно 0,1, независимо от того, что произошло.

Строка конструктор, с другой стороны, вполне предсказуемо: писать новый BigDecimal («0,1») создает BigDecimal, который точно равно 0,1, как можно было бы ожидать. Следовательно, обычно рекомендуется, чтобы конструктор String использовался в .

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

+0

Привет @Ankur. действительно очень приятно объяснил :) Спасибо. когда следует использовать 'public BigDecimal (double val)' подрядчик? Любой соответствующий пример? –

+0

@ VishalZanzrukia ответ отредактирован, в основном должен использоваться, когда вам нужно точное преобразование переданного в двойном значении, порекомендует вам прочитать документы, я предоставил вам ссылки –

4

Вы передаете double при построении BigDecimal, чтобы точность была потеряна. Самый простой фикс, вероятно, что-то вроде

System.out.println(new BigDecimal("58.34")); 

Выход

58.34 
3

Это приведет к тому из-за double значения

System.out.println(new BigDecimal(58.34)); 
            ^^^ 

Чтобы избежать этого можно использовать строковое значение

System.out.println(new BigDecimal("58.34"));