Что такое широкий диапазон значений float и double в Java? - PullRequest
21 голосов
/ 30 октября 2009

Что такое широкий диапазон значений float и double в Java?

Почему не рекомендуется использовать float или double для чего-либо, где точность важна?

Ответы [ 5 ]

22 голосов
/ 05 ноября 2013

Примитивные типы данных Java

булево: 1 бит. Может принимать значения только true и false.

байт: 1 подписанный байт (два дополнения). Охватывает значения от -128 до 127.

короткий: 2 байта со знаком (дополнение двух), от -32 768 до 32 767

INT: 4 байта, подписано (два дополнения). От -2 147 483 648 до 2 147 483 647.

долго: 8 байтов подписано (два дополнения). Диапазон от -9,223,372,036,854,775,808 до + 9,223,372,036,854,775,807.

Поплавок: 4 байта, IEEE 754. Охватывает диапазон от 1,40129846432481707e-45 до 3,40282346638528860e + 38 (положительный или отрицательный).

двойной: 8 байтов IEEE 754. Охватывает диапазон от 4.94065645841246544e-324d до 1.79769313486231570e + 308d (положительный или отрицательный).

символ: 2 байта, без знака, Unicode, от 0 до 65 535

20 голосов
/ 30 октября 2009

Класс Java Double содержит члены, содержащие значения Min и Max для типа.

2^-1074 <= x <= (2-2^-52)·2^1023 // where x is the double.

Проверьте Min_VALUE и MAX_VALUE статические конечные элементы Double.

(некоторые) Люди предложат не использовать типы с плавающей запятой для вещей, где точность и точность имеют решающее значение, поскольку ошибки округления могут отбросить вычисления на измеримые (небольшие) величины.

8 голосов
/ 30 октября 2009

Двоичные числа с плавающей запятой имеют интересные характеристики точности, поскольку значение сохраняется в виде двоичного целого числа, возведенного в двоичную степень. При работе с целочисленными значениями (то есть значениями от 0 до 1) отрицательные степени двух «округляются» совсем иначе, чем отрицательные степени десяти.

Например, число 0.1 может быть представлено как 1 x 10 -1 , но нет комбинации показателя экспоненты base-2 и мантиссы, которая может точно представлять 0,1 - самое близкое, что вы получите, - 0,10000000000000001 .

Так что, если у вас есть приложение, в котором вы работаете с такими значениями, как 0,1 или 0,01, но где небольшие (менее 0,000000000000001%) ошибки не допускаются, то двоичные числа с плавающей запятой не для вас.

И наоборот, если степени десяти не являются «особыми» для вашего приложения (степени десяти важны в расчетах валют, но не, скажем, в большинстве приложений физики), тогда вам лучше использовать двоичную с плавающей точкой , поскольку обычно он по крайней мере на порядок быстрее и эффективнее с точки зрения памяти.

Статья из документации Python о проблемах и ограничениях с плавающей запятой отлично объясняет эту проблему в простой для понимания форме. В Википедии также есть хорошая статья о с плавающей точкой , в которой объясняется математика, лежащая в основе представления.

5 голосов
/ 30 октября 2009

С Типы данных примитивов :

  • float: Тип данных float - 32-разрядный IEEE 754 с одинарной точностью плавающая запятая. Диапазон значений выходит за рамки этого обсуждения, но указано в разделе 4.2.3 спецификации языка Java. Как с рекомендациями для byte и short, используйте float (вместо double) если вам нужно сэкономить память в больших массивах с плавающей точкой номера. Этот тип данных никогда не должен использоваться для точных значений, таких как валюта. Для этого вам нужно будет используйте java.math.BigDecimal класс вместо Числа и Струны , чехлы BigDecimal и другие полезные классы, предоставляемые Платформа Java.

  • double: тип данных double - 64-разрядный IEEE 754 с двойной точностью плавающая запятая. Диапазон значений выходит за рамки этого обсуждения, но указано в разделе 4.2.3 спецификации языка Java. Для десятичных значений этот тип данных как правило, выбор по умолчанию. Как упомянутый выше, этот тип данных должен никогда не использовать для точных значений, таких как в качестве валюты.

Диапазон значений см. В разделе 4.2.3 Типы с плавающей запятой, форматы и значения JLS.

3 голосов
/ 30 октября 2009

Конечно, вы можете использовать числа с плавающей запятой или двойные для "критических" вещей ... Многие приложения ничего не делают, кроме обработки чисел с использованием этих типов данных.

Возможно, вы неправильно поняли некоторые предостережения относительно чисел с плавающей запятой, например рекомендацию никогда не сравнивать для точного равенства и т. Д.

...