Когда происходит потеря данных при преобразовании из BigDecimal в Double в Java

Я знаю, что при преобразовании значений BigDecimal в Double в Java возникают «проблемы с точностью». Когда происходит «потеря данных» при простом преобразовании из BigDecimal в Double с использованием BigDecimal.doubleValue()? Например, если я конвертирую 1.1 из BigDecimal в Double и распечатываю его, он печатает «1.1», что я считаю без потери данных (BigDecimal было 1.1, а напечатанное значение было 1.1). В каких случаях эти два значения не будут одинаковыми при простом преобразовании из BigDecimal в Double таким образом?


person Panh    schedule 25.04.2018    source источник
comment
Если вы выберете более высокую точность при печати, вы увидите, что значение double очень близко к 1,1, но не точно, потому что двоичное число с плавающей запятой не может точно представлять 1,1, в то время как BigDecimal может. Отсюда и потеря точности. Тот факт, что double имеет только ограниченное количество битов, в то время как BigDecimal почти неограниченное число, также должен быть подсказкой.   -  person Rudy Velthuis    schedule 25.04.2018


Ответы (1)


BigDecimal имеет столько точности, сколько вам нужно. double имеет 53 бита двоичной точности, что составляет ~ 15,9 десятичных цифр. Таким образом, каждый раз, когда ваш BigDecimal имеет> 16 значащих цифр, вы теряете точность при преобразовании в double.

[Это относится к целочисленным значениям. Ситуация с дробями значительно сложнее, но факт остается фактом: BigDecimal имеет неограниченную точность, а double — нет.]

Также double имеет минимальное и максимальное значения, заданные Double.MIN_VALUE/MAX_VALUE. BigDecimal не имеет ни того, ни другого.

person user207421    schedule 25.04.2018
comment
Есть ли другие случаи, кроме этого? - person Panh; 25.04.2018
comment
Точность и диапазон. Больше ничего нет. - person user207421; 25.04.2018