86

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

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

4

6 回答 6

117

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

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

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

此外,由于所有内容都是二进制(尾数和指数),因此转换为十进制数通常不准确。像 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

于 2012-11-24T17:22:04.000 回答
40
于 2018-06-16T04:42:16.573 回答
17

来自java规范

浮点类型为 float 和 double,它们在概念上与 IEEE 二进制浮点算术标准、ANSI/IEEE 中指定的单精度 32 位和双精度 64 位格式 IEEE 754 值和运算相关联标准 754-1985(IEEE,纽约)。

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

重要的是要了解精度不是统一的,并且这不是对整数的精确存储。

一个例子 :

double a = 0.3 - 0.1;
System.out.println(a);          

印刷

0.19999999999999998

如果您需要任意精度(例如出于财务目的),您可能需要Big Decimal

于 2012-11-24T16:11:13.547 回答
7

一个普通的数学答案。

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

使用高指数,例如 10²³,如果最低有效位发生变化,则两个相邻可区分数字之间会出现很大差异。此外,以 2 为底的小数点使得许多以 10 为底的数字只能近似;1/5、1/10 是无穷无尽的数字。

所以一般来说:如果您关心有效数字,则不应使用浮点数。对于计算金额,e,a,最好使用BigDecimal

对于物理浮点双打就足够了,几乎从不浮动。此外,处理器的浮点部分 FPU 甚至可以在内部使用更高的精度。

于 2012-11-24T16:30:23.293 回答
3

浮点数使用指数形式编码,类似于m * b ^ e,即根本不像整数。您提出的问题在定点数的上下文中是有意义的。有许多可用的定点算术库

关于浮点运算:小数位数取决于表示和数字系统。例如,周期数 ( 0.33333) 没有十进制的有限表示,但有二进制表示,反之亦然。

另外值得一提的是,直到某个点的浮点数确实有大于 1 的差异,即value + 1产量value,因为value + 1不能使用m * b ^ e、 where和 进行编码mb并且e长度是固定的。对于小于 1 的值也会发生同样的情况,即所有可能的代码点的距离都不相同。

因此,没有像定点数那样精确的n数字精度,因为并非每个带有n十进制数字的数字都具有 IEEE 编码。

您应该阅读一份几乎强制性的文档,其中解释了浮点数: 每个计算机科学家都应该了解浮点运算

于 2012-11-24T16:26:58.340 回答
1

查看Float.intBitsToFloatDouble.longBitsToDouble,它解释了位如何对应于浮点数。特别是,正常的位float看起来像

 s * 2^exp * 1.ABCDEFGHIJKLMNOPQRSTUVW

其中 A...W 是 23 位 - 0 和 1 - 表示二进制小数 - s 是 +/- 1,分别由 0 或 1 表示,exp 是有符号的 8 位整数。

于 2012-11-24T16:33:58.763 回答