Я знаю, что при преобразовании значений BigDecimal в Double в Java возникают «проблемы с точностью». Когда происходит «потеря данных» при простом преобразовании из BigDecimal в Double с использованием BigDecimal.doubleValue()? Например, если я конвертирую 1.1 из BigDecimal в Double и распечатываю его, он печатает «1.1», что я считаю без потери данных (BigDecimal было 1.1, а напечатанное значение было 1.1). В каких случаях эти два значения не будут одинаковыми при простом преобразовании из BigDecimal в Double таким образом?
Когда происходит потеря данных при преобразовании из BigDecimal в Double в Java
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
Есть ли другие случаи, кроме этого?
- person Panh; 25.04.2018
Точность и диапазон. Больше ничего нет.
- person user207421; 25.04.2018