一尘不染

Java中的浮点数和双精度数有多少个有效数字?

java

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

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


阅读 497

收藏
2020-03-02

共1个答案

一尘不染

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(浮点和重复使用此技巧)。

另外,由于所有内容均为二进制(尾数和指数),因此通常无法精确转换为十进制数。像0.5、0.25、0.75、0.125这样的数字会被精确存储,但不会存储0.1。正如其他人所说,如果您需要精确存储美分,则不要使用float或double,而应使用int,long,BigInteger或BigDecimal。

2020-03-02