在java中,浮点数和双精度值有多少个有效数字?
浮点数是否有 32 个二进制数字,而双精度型有 64 个二进制数字?文档太难理解了。
是否所有位都转换为有效数字?还是小数点的位置占用了一些位?
浮点数是否有 32 个二进制数字,而双精度型有 64 个二进制数字?文档太难理解了。
是否所有位都转换为有效数字?还是小数点的位置占用了一些位?
float:32 位(4 个字节),其中 23 位用于尾数(约 7 个十进制数字)。8 位用于指数,因此浮点数可以使用这 8 位将小数点“移动”到右侧或左侧。这样做可以避免在尾数中存储大量零,如 0.0000003(3 × 10-7)或 3000000(3 × 107)。有 1 位用作符号位。
double:64 位(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
长答案:
浮点数有三个组成部分:
从本质上讲,这可以解决.数字的“大小”,它是指数,与我们无关,因为它只缩放分数部分的值。知道了,给出的位数,†我们可以用 来确定浮点数的精度。由于浮点数中的每个位存储 2 种可能性,因此二进制位数最多可以存储一个数字(其中一个值为零的值的总和)。这有点毛茸茸的,因为事实证明,浮点数存储的分数比它们可以使用的分数少一位,因为零是专门表示的,所有非零数字都有至少一个非零二进制位。sign * 2^exponent * (1 + fraction)
log₁₀(n)
n
log₁₀(largest_possible_fraction)
n
2ⁿ - 1
2ⁿ
结合这一点,浮点数的精度位数是 ,其中浮点数分数的位数。对于精度为 ≈7.22 十进制数字,32 位浮点数为 24 位,对于精度为 ≈15.95 十进制数字,64 位双精度具有 53 位分数。log₁₀(2ⁿ)
n
有关浮点精度的更多信息,您可能需要阅读有关机器 epsilon 概念的信息。
† 至少对于其他数字,您的公式看起来更像 。n ≥ 1
⌊log₁₀(|n|)⌋ + 1
‡ “此规则称为前导位约定、隐式位约定或隐藏位约定。(维基百科)