- •Тема 3. Лексические структуры языка. Примитивные типы данных. Декларация и инициализация переменных. Основные типы операторов.
- •3.1 Примитивные типы данных
- •3.2 Лексические структуры языка
- •3.2.1 Пробелы
- •3.2.2 Идентификаторы
- •3.2.3 Константы
- •3.2.4 Комментарии
- •3.2.5 Разделители
- •3.2.6 Ключевые слова Java
- •4 Операторы
- •4.1 Операция присваивания
- •4.2 Унарные операции
- •4.3 Арифметические бинарные операции
- •4.6 Операции сравнения
- •4.6.1 Логические операции
- •4.7 Условная операция
- •4.8 Приоритет операций
- •4.9 Преобразование и приведение типов при выполнении операций
- •4.10 Переполнение целого числа
- •4.11 Операции с дробными типами
- •4.12 Операция конкатенации строк
- •5 Классы-обертки
- •6 Уловки и ловушки, связанные с плавающей точкой и десятичными числами
- •6.1 Плавающая точка ieee
- •6.2 Специальные числа
- •6.3 Непредвиденные обстоятельства использования плавающей точки
- •6.4 Ошибки округления
- •6.5 Рекомендации по сравнению чисел с плавающей точкой
- •6.6 Не используйте числа с плавающей точкой для точных значений
- •6.7 Большие десятичные дроби для маленьких чисел
- •6.8 Все методы сравнения не созданы равными
- •6.9 Используйте BigDecimal в качестве типа обмена
- •6.10 Построение чисел BigDecimal
6.10 Построение чисел BigDecimal
Существует несколько конструкторов для BigDecimal. Один в качестве входной информации использует плавающую точку удвоенной точности, второй - целое число и коэффициент масштабирования, а третий - String - представление десятичного числа. Вам нужно быть осторожными с конструктором BigDecimal(double), поскольку он может позволить ошибкам округления появиться в Ваших вычислениях раньше, чем вы об этом узнаете. Вместо этого используйте целое число или конструкторы, основанные на String.
Ненадлежащее использование конструктора BigDecimal(double) может проявляться в кажущихся странными ошибках в JDBC-драйверах при передаче в JDBC setBigDecimal() метод. Например, рассмотрим следующий JDBC-код, который хочет сохранить число 0.01 в десятичном поле:
PreparedStatement ps =
connection.prepareStatement("INSERT INTO Foo SET name=?, value=?");
ps.setString(1, "penny");
ps.setBigDecimal(2, new BigDecimal(0.01));
ps.executeUpdate();
В зависимости от Вашего драйвера JDBC, этот кажущийся безобидным код может при выполнении выдать некоторые запутанные ошибки, потому что приближенная величина с удвоенной точностью 0.01 приведет к большому дифференцированному значению, которое может запутать JDBC-драйвер и базу данных. Ошибка появится в JDBC драйвере, но весьма маловероятно, что она проявит себя, и Вы не будете знать, что не так с Вашим кодом, до тех пор, пока Вы не поймете ограничения двоичных чисел с плавающей точкой. Чтобы избежать возникновения таких проблем, сконструируйте BigDecimal, используя BigDecimal("0.01") или BigDecimal(1, 2) , так как каждый из них, в конечном счете, приведет к точному десятичному представлению.
Список использованных источников
Шилдт Герберт. Полный справочник по Java, 7-е издание.: Пер. с англ. – М.: ООО “И.Д. Вильямс”, 2007. – 1040с.: ил. – Парал. тит. англ.
Программирование на Java. Методическое руководство для преподавателей. Центр Sun технологий МФТИ,ЦОС и ВТ МФТИ. 2003.
Теория и практика Java: Где ваша точка? Уловки и ловушки, связанные с плавающей точкой и десятичными числами. Брайан Гетц, главный консультант, Quiotix. 2007.
Операции над примитивными данными http://mirdryzey.ru/index.php/articles/javamenu/143------java.html.