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

Eam*_*ney 77 java floating-point

浮点数是32个二进制数字,双数字是64个二进制数字吗?文档太难理解了.

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

mar*_*cus 95

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

double:64位(8字节),其中52位用于尾数(约16个十进制数字).11位用于指数,1位用于符号位.

由于我们使用的是二进制(只有0和1),当数字非零时,尾数中的一位隐式为1(float和double都使用此技巧).

此外,由于所有内容都是二进制(尾数和指数),因此转换为十进制数通常不准确.像0.5,0.25,0.75,0.125这样的数字是精确存储的,但0.1不是.正如其他人所说,如果你需要精确存储美分,不要使用float或double,请使用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

  • `double`的15.9十进制数和`float`的7.2,即15和7.在每种情况下都可以表示一些较大的数字,并且它们都不适用于分数,但它没有"平均",而且你的消息来源都没有说. (8认同)
  • 有些数字可以比其他数字更精确地用二进制表示。您可以看到 0.125(1/8,8 是 2 的幂)和 0.1(1/10,10 不是 2 的幂)之间的差异。前者有更多(十进制)数字,但表示准确。所以有可能是一个有 6 位十进制数字的数字比另一个有 8 位数字的数字具有更大的舍入误差。 (2认同)
  • 有趣的是,实际上精确度比尾数/有效位数中存储的位数还要高。分别存储了23位和52位的float和double位,但是由于数字已标准化,我们可以假定前导1位,然后将其忽略。这就是为什么有效精度分别为24位和53位的原因。计算精确的十进制精度log10(2 ^ 24)= 7.22和log10(2 ^ 53)= 15.95 (2认同)

999*_*ars 25

32位浮点数具有大约7位精度,64位双精度位数具有大约16位精度

答案很长:

浮点数有三个组成部分:

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

从本质上讲,这是有效的sign * 2^exponent * (1 + fraction).数字的"大小",它的指数,与我们无关,因为它只缩放小数部分的值.知道log??(n)给出的位数n,†我们可以确定浮点数的精度log??(largest_possible_fraction).因为在浮法商店2点的可能性的每个比特的二进制数n位可以存储数达2? - 1(共2? ,其中一个值是零).这有点毛茸茸,因为事实证明浮点数的存储比它们可以使用的分数少一点,因为零是特殊表示的,所有非零数字都至少有一个非零二进制位.‡

结合这一点,浮点数的精度 数位是,浮点数的分数位数log??(2?)在哪里n.32位浮点数具有24位分数,精度为≈7.22十进制数字,64位双精度具有53位分数,精度为≈15.95十进制数字.

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


n ? 1至少 - 对于其他数字,您的公式看起来更像 ?log??(|n|)? + 1.

‡"此规则被称为前导位约定,隐式位约定或隐藏位约定."(维基百科)


Den*_*ret 17

来自java规范:

浮点类型是float和double,它们在概念上与单精度32位和双精度64位格式IEEE 754值和操作相关联,如IEEE标准二进制浮点运算,ANSI/IEEE标准754-1985(IEEE,纽约).

由于在不了解IEEE754基础知识的情况下很难对数字做任何事情,这里是另一个链接.

重要的是要理解精度不均匀,并且这不是对整数的精确存储.

一个例子 :

double a = 0.3 - 0.1;
System.out.println(a);          
Run Code Online (Sandbox Code Playgroud)

版画

0.19999999999999998
Run Code Online (Sandbox Code Playgroud)

如果您需要任意精度(例如出于财务目的),您可能需要大十进制.


Joo*_*gen 7

一个正常的数学答案.

理解浮点数被实现为表示指数和其余部分的一些位,大部分用于数字(在二进制系统中),其中一个具有以下情况:

如果最低有效位改变,则指数高,例如10²³,两个相邻的distinghuishable数字之间会出现较大的差异.此外,基数为2的小数点使得许多基数为10的数字只能近似; 1/5,1/10是无穷无尽的数字.

所以一般情况下:如果您关心有效数字,则不应使用浮点数.对于计算的货币金额,e,a,最好使用BigDecimal.

对于物理学,浮点数双倍是足够的,浮动几乎从不.此外,处理器的浮点部分FPU甚至可以在内部使用更多的精确度.