Java中浮点数和双精度的包含范围是多少?

Aus*_*Way 23 java floating-point double types range

Java中浮点数和双精度的包含范围是多少?

为什么不建议在精度至关重要的地方使用float或double?

jec*_*viz 25

Java的原始数据类型

布尔值:1位.可以仅采用值true和false.

byte:1个有符号字节(二进制补码).涵盖从-128到127的值.

短:2个字节,有符号(二进制补码),-32,768到32,767

int:4个字节,有符号(二进制补码).-2,147,483,648至2,147,483,647.

long:8个字节签名(二进制补码).范围从-9,223,372,036,854,775,808到+9,223,372,036,854,775,807.

float:4个字节,IEEE 754.涵盖范围从1.40129846432481707e-45到3.40282346638528860e + 38(正或负).

double:8字节IEEE 754.涵盖范围从4.94065645841246544e-324d到1.79769313486231570e + 308d(正或负).

char:2个字节,无符号,Unicode,0到65,535


jjn*_*guy 22

Java的Double类具有包含该类型的Min和Max值的成员.

2^-1074 <= x <= (2-2^-52)·2^1023 // where x is the double.
Run Code Online (Sandbox Code Playgroud)

查看Min_VALUEMAX_VALUE静态最终成员Double.

(某些)人们会建议不要在精度和精度至关重要的情况下使用浮点类型,因为舍入误差可能会导致可测量(小)量的计算.

  • 不要忘记一些数字在Float或Double中无法表示.标准示例是想象一个银行应用程序,您从2.00美元撤回1.10美元.使用双打的结果将是$ 0.899999999999999,因为能够在双倍中表示1.1. (8认同)
  • @dtsazza - 它不需要使用BigDecimal,你也可以使用整数类型并用美分表示数字(而不是分数美元).关键在于,由于精度有限,您不得使用浮动或双倍换钱. (5认同)

Dan*_*den 8

二进制浮点数具有有趣的精度特性,因为该值存储为二进制整数,以二进制幂表示.当处理子整数值(即0到1之间的值)时,两个"舍入"的负幂与十的负幂非常不同.

例如,数字0.1可以用1 x 10 -1表示,但是没有基数2指数和尾数的组合可以精确地表示0.1 - 最接近的是0.10000000000000001.

因此,如果您有一个应用程序,您正在使用0.1或0.01这样的值,但是如果不能容忍小的(小于0.000000000000001%)错误,则二进制浮点数不适合您.

相反,如果10的幂对你的应用来说不是"特殊的"(10的幂在货币计算中很重要,但在大多数物理应用中都不重要),那么你实际上最好使用二进制浮点,因为它是通常至少快一个数量级,并且它的内存效率更高.

Python文档中关于浮点问题和限制的文章以易于理解的形式解释了这个问题.维基百科也有一篇关于浮点的好文章,解释了表示背后的数学.


Pas*_*ent 6

原始数据类型:

  • float:float数据类型是单精度32位IEEE 754浮点.它的值范围超出了本讨论的范围,但 在Java语言规范的4.2.3节中有详细说明.正如所提建议byteshort,使用float(而不是 double如果你需要节省内存浮点数的大型阵列).绝不应将此数据类型用于精确值,例如货币.为此,您需要使用java.math.BigDecimal 类.数字和字符串涵盖BigDecimalJava平台提供的其他有用类.

  • double:double数据类型是双精度64位IEEE 754浮点.它的值范围超出了本讨论的范围,但 在Java语言规范的4.2.3节中有详细说明.对于十进制值,此数据类型通常是默认选择.如上所述,此数据类型不应用于精确值,例如货币.

有关值的范围,请参见4.2.3 JLS的浮点类型,格式和值一节.