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

时间:2009-10-30 15:30:34

标签: java types floating-point double range

Java中包含float和double的范围是什么?

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

5 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:20)

Java Double类的成员包含该类型的Min和Max值。

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

查看Min_VALUE的{​​{1}}和MAX_VALUE静态最终成员。

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

答案 2 :(得分:8)

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

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

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

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

floating point issues and limitations上的Python文档中的文章以易于理解的形式解释了这个问题。维基百科也有一篇关于floating point的好文章解释了代表背后的数学。

答案 3 :(得分:5)

来自Primitives Data Types

  
      
  • float: float数据类型是单精度32位IEEE 754   浮点。它的价值范围是   超出了本讨论的范围,   但是在4.2.3部分中指定   Java语言规范。如   以及byte的建议   和short,使用float(代替   double)如果你需要节省内存   在大型浮点数组中   数字。这种数据类型永远不应该   用于精确值,例如   货币。为此,你需要   使用java.math.BigDecimal   而是改为。 Numbers and Strings涵盖BigDecimal和   其他有用的类由。提供   Java平台。

  •   
  • double double数据类型是双精度64位IEEE 754   浮点。它的价值范围是   超出了本讨论的范围,   但是在4.2.3部分中指定   Java语言规范。   对于十进制值,此数据类型为   一般是默认选择。如   如上所述,这种数据类型应该   永远不会被用于精确的价值观   作为货币。

  •   

有关值的范围,请参阅JLS的4.2.3 Floating-Point Types, Formats, and Values部分。

答案 4 :(得分:3)

当然,您可以使用浮点数或双精度数来表示“关键”事物......许多应用程序只会使用这些数据类型来处理数字。

您可能误解了有关浮点数的各种警告,例如建议永远不会compare for exact equality,等等。