Авторские Материалы о событиях в Израиле на Ближнем Востоке и в мире

IsraMir.com - Израильская журналистика

Default color brown color green color red color blue color
Вы сейчас тут: Новости arrow Техотдел arrow Свет ученья arrow Работа над ошибками, часть 5-я
Skip to content
Работа над ошибками, часть 5-я Версия для печати Отправить на e-mail
Sunday, 02 April 2006 | Сайт SQL.Ru для раздела Ученье – свет
Работанадошибками,часть5-яjavaisramir.comСегодня мы выбрали для публикации один пункт, который показался нам настолько существенным, что заслуживает именно отдельного показа. Ошибки, связанные с использованием не тех числовых форматов (типов) – одни из самых распространенных при обучении основам программирования – знаем по собственному опыту. А в Java они имеют и дополнительный «шанс» на появление – это связано со многими особенностями языка.
 
Использование типа double как float
Как и в большинстве других языков, в Java поддерживаются операции
над числами с плавающей точкой (дробными числами). В Java есть 2
типа-примитива для чисел с плавающей точкой: double для чисел с
64-битной точностью по стандарту IEEE, и float, для чисел с 32-битной
точностью по стандарту IEEE. Трудность заключается в использовании
десятичных чисел, таких как 1.75, 12.9e17 или -0.00003 - компилятор
присваивает им тип double.

Java не производит приведение типов в операциях, в которых может произойти
потеря точности. Такое приведение типов должен осуществлять программист.
Например, Java не позволит присвоить значение типа int переменной типа byte
без приведения типов, как показано в примере ниже.
 
byte byteValue1 = 17; /* неправильно! */
byte byteValue2 = (byte)19; /* правильно */

Так как дробные числа представлены типом double, и присваивание double
переменной типа float может привести к потере точности, компилятор
пожалуется на любую попытку использовать дробные числа как float. Так что
использование присваиваний, приведенных ниже, не даст классу
откомпилироваться.
 
float realValue1 = -1.7;          /* неправильно! */
float realValue2 = (float)(-1.9); /* правильно */

Это присваивание сработало бы в C или C++, для Java все гораздо строже.
Есть 3 способа избавиться от этой ошибки.

Можно использовать тип double вместо типа float. Это наиболее простое
решение. На самом деле нет особого смысла использовать 32-битную
арифметику вместо 64-битной, разницу в скорости все равно скушает
JVM (к тому же в современных процессорах все дробные числа приводятся
к формату 80-битного регистра процессора перед любой операцией).
Единственный плюс использования float - это то, что они занимают
меньше памяти, что бывает полезно при работе с большим числом дробных
переменых.

Можно использовать модификатор для обозначения типа числа, чтобы
сообщить компилятору как хранить число. Модификатор для типа
float - 'f'. Таким образом, компилятор присвоит числу 1.75 тип double,
а 1.75f - float.
Например:
 
float realValue1 = 1.7;    /* неправильно! */
float realValue2 = 1.9f;   /* правильно */

Можно использовать явное приведение типов. Это наименее элегантный способ,
но он полезен при конвертации переменной типа double в тип float.
Пример:
 
float realValue1 = 1.7f;
double realValue2 = 1.9;
realValue1 = (float)realValue2;


 
 

Добавить комментарий

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:


Автотранслитерация: выключена

Защитный код

Powered by jComments