Вот несколько разных попыток распечатать содержимое двойного значения:
import java.math.*;
public class FloatShow {
public static void main(String ... args) {
System.out.println(1.2);
System.out.println(new Double(1.2).toString());
System.out.println(new BigDecimal(1.2).toString());
}
}
Это распечатывает
1.2
1.2
1.1999999999999999555910790149937383830547332763671875
Метод println, заданный двойным, помещает его в коробку и вызывает toString , аналогично Double использует toString, который выполняет округление за вас. BigDecimal использует исходное значение для создания экземпляра и представляет его без очистки. Значит, ваши предположения о точности неверны.
Плавающая точка и фиксированное десятичное число - это две разные концепции. Вот определение арифметики с плавающей запятой c в Википедии :
В вычислениях арифметика с плавающей запятой c (FP) - это арифметика c с использованием формулы c представление действительных чисел в качестве приближения для поддержки компромисса между диапазоном и точностью. По этой причине вычисления с плавающей запятой часто встречаются в системах, которые включают в себя очень маленькие и очень большие действительные числа, требующие быстрой обработки.
Но фиксированная десятичная дробь (например, BigDecimal) отличается, она сохраняет отдельные цифры. BigDecimal медленнее в использовании, но он не делает такого компромисса с точностью до диапазона, как с плавающей запятой. не совсем точны (но точны в пределах известного диапазона ошибок), и можно рассчитать, что скорость стоит компромисса. Для многих бизнес-приложений разница в производительности не является проблемой, потому что узким местом всегда является что-то еще, значения известны точно, а точность не подлежит обсуждению.