Java中float和double的范围是多less?

Java中float和double的范围是多less?

为什么不build议在精度要求很高的情况下使用float或double?

Java的Double类具有包含该types的最小值和最大值的成员。

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

查看DoubleMin_VALUEMAX_VALUE静态最终成员。

(一些)人们会build议不要使用浮点types,因为精度和精度是至关重要的,因为舍入错误可能会导致计算量(小)。

Java的原始数据types

布尔值:1位。 只能看到真值和假值。

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

短:2个字节,有符号(二的补码),-32768到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。

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

双倍:8字节IEEE 754.覆盖范围从4.94065645841246544e-324d到1.79769313486231570e + 308d(正值或负值)。

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

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

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

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

相反,如果十次幂对您的应用程序不是“特殊的”(十次幂在货币计算中很重要,而不是在物理的大部分应用中),那么实际上使用二进制浮点更好,因为它通常至less要快一个数量级,而且内存效率要高得多。

关于浮点问题和限制的Python文档中的文章以很容易理解的forms解释了这个问题。 维基百科也有一篇关于浮点数的好文章,它解释了表示的math原理。

来自基元数据types :

  • float: float数据types是一个单精度的32位IEEE 754浮点。 它的值范围超出了这个讨论的范围,但在Java语言规范的第4.2.3节中有详细说明。 如同对byteshort的build议一样,如果需要将内存保存在浮点数的大数组中,请使用float (而不是double )。 这种数据types决不能用于精确的值,例如货币。 为此,您将需要使用java.math.BigDecimal类。 数字和string涵盖Java平台提供的BigDecimal和其他有用的类。

  • doubledouble数据types是一个双精度64位IEEE 754浮点。 它的值范围超出了这个讨论的范围,但在Java语言规范的第4.2.3节中有详细说明。 对于十进制值,这种数据types通常是默认select。 如上所述,这种数据types决不能用于精确的值,例如货币。

有关值的范围,请参阅4.2.3 JLS的浮点types,格式和值 。

当然,你可以使用浮动或双打“关键”的东西…许多应用程序除了使用这些数据types紧缩数字什么也不做。

您可能误解了浮点数的一些注意事项,例如build议永远不要比较精确的相等性等等。