在java中,浮点数和双精度值有多少个有效数字?

2022-08-31 11:36:48

浮点数是否有 32 个二进制数字,而双精度型有 64 个二进制数字?文档太难理解了。

是否所有位都转换为有效数字?还是小数点的位置占用了一些位?


答案 1

float32 位(4 个字节),其中 23 位用于尾数(约 7 个十进制数字)。8 位用于指数,因此浮点数可以使用这 8 位将小数点“移动”到右侧或左侧。这样做可以避免在尾数中存储大量零,如 0.0000003(3 × 10-7)或 3000000(3 × 107)。有 1 位用作符号位。

double64 位(8 个字节),其中 52 位用于尾数(约 16 个小数位)。11 位用于指数,1 位用于符号位。

由于我们使用的是二进制(只有 0 和 1),因此当数字不为零时,尾数中的一位隐式为 1(浮点数和双精度都使用此技巧)。

此外,由于一切都是二进制的(尾数和指数),因此到十进制数的转换通常不准确。像0.5,0.25,0.75,0.125这样的数字是完全存储的,但0.1不是。正如其他人所说,如果您需要精确地存储美分,请不要使用浮点数或双精度,而是使用int,long,BigInteger或BigDecimal。

来源:

http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers

http://en.wikipedia.org/wiki/Binary64

http://en.wikipedia.org/wiki/Binary32


答案 2

32 位浮点数的精度约为 7 位,64 位的双精度约为 16 位

长答案:

浮点数有三个组成部分:

  1. 一个符号位,用于确定数字是正数还是负数。
  2. 指数,用于确定数字的大小。
  3. 一个分数,用于确定数字在两个指数值之间的距离。这有时被称为“有效数,尾数或系数”

从本质上讲,这可以解决.数字的“大小”,它是指数,与我们无关,因为它只缩放分数部分的值。知道了,给出的位数,†我们可以用 来确定浮点数的精度。由于浮点数中的每个位存储 2 种可能性,因此二进制位数最多可以存储一个数字(其中一个值为零的值的总和)。这有点毛茸茸的,因为事实证明,浮点数存储的分数比它们可以使用的分数少一位,因为零是专门表示的,所有非零数字都有至少一个非零二进制位。sign * 2^exponent * (1 + fraction)log₁₀(n)nlog₁₀(largest_possible_fraction)n2ⁿ - 12ⁿ

结合这一点,浮点数的精度位数是 ,其中浮点数分数的位数。对于精度为 ≈7.22 十进制数字,32 位浮点数为 24 位,对于精度为 ≈15.95 十进制数字,64 位双精度具有 53 位分数。log₁₀(2ⁿ)n

有关浮点精度的更多信息,您可能需要阅读有关机器 epsilon 概念的信息。


† 至少对于其他数字,您的公式看起来更像 。n ≥ 1⌊log₁₀(|n|)⌋ + 1

‡ “此规则称为前导位约定、隐式位约定或隐藏位约定。(维基百科)