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

新手上路,请多包涵

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

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

原文由 Eamon Moloney 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 522
1 个回答

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(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

原文由 marcus 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题