| Работа над ошибками, часть 5-я |
|
|
Sunday, 02 April 2006 | Сайт SQL.Ru для раздела Ученье – свет Сегодня мы выбрали для публикации один пункт, который показался нам настолько существенным, что заслуживает именно отдельного показа. Ошибки, связанные с использованием не тех числовых форматов (типов) – одни из самых распространенных при обучении основам программирования – знаем по собственному опыту. А в Java они имеют и дополнительный «шанс» на появление – это связано со многими особенностями языка.Использование типа double как float
Как и в большинстве других языков, в Java поддерживаются операции над числами с плавающей точкой (дробными числами). В Java есть 2 типа-примитива для чисел с плавающей точкой: double для чисел с 64-битной точностью по стандарту IEEE, и float, для чисел с 32-битной точностью по стандарту IEEE. Трудность заключается в использовании десятичных чисел, таких как 1.75, 12.9e17 или -0.00003 - компилятор присваивает им тип double. Java не производит приведение типов в операциях, в которых может произойти потеря точности. Такое приведение типов должен осуществлять программист. Например, Java не позволит присвоить значение типа int переменной типа byte без приведения типов, как показано в примере ниже.
Так как дробные числа представлены типом double, и присваивание double переменной типа float может привести к потере точности, компилятор пожалуется на любую попытку использовать дробные числа как float. Так что использование присваиваний, приведенных ниже, не даст классу откомпилироваться.
Это присваивание сработало бы в C или C++, для Java все гораздо строже. Есть 3 способа избавиться от этой ошибки. Можно использовать тип double вместо типа float. Это наиболее простое решение. На самом деле нет особого смысла использовать 32-битную арифметику вместо 64-битной, разницу в скорости все равно скушает JVM (к тому же в современных процессорах все дробные числа приводятся к формату 80-битного регистра процессора перед любой операцией). Единственный плюс использования float - это то, что они занимают меньше памяти, что бывает полезно при работе с большим числом дробных переменых. Можно использовать модификатор для обозначения типа числа, чтобы сообщить компилятору как хранить число. Модификатор для типа float - 'f'. Таким образом, компилятор присвоит числу 1.75 тип double, а 1.75f - float. Например:
Можно использовать явное приведение типов. Это наименее элегантный способ, но он полезен при конвертации переменной типа double в тип float. Пример:
|
|||||