java - java中的 float 和 double 有多少位有效数字?

标签 java floating-point

float 有 32 位二进制数, double 有 64 位二进制数吗?文档太难理解了。

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

最佳答案

float:32 位(4 个字节),其中 23 位 用于尾数(大约 7 个十进制数字)。 8 位用于指数,因此 float 可以使用这 8 位将小数点向右或向左“移动”。这样做可以避免在尾数中存储大量零,如 0.0000003 (3 × 10-7) 或 3000000 (3 × 107)。有 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

关于java - java中的 float 和 double 有多少位有效数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13542944/

相关文章:

java - 双重计算产生奇数结果

java - 有没有类似appfuse的java web应用模板?

java - 踩踏websocket : The send buffer size exceeded the allowed limit

java - 如何使 JDialog 处于非 Activity 状态

ruby - 在不使用 BigDecimal 的情况下将美分转换为 Ruby 中的美元字符串

math - float 学有问题吗?

java - 从命令行参数控制程序

java - Android,未经许可或签名重启设备

c# - 使用 C# 将 big endian 的 float 值转换为 little endian

c++ - 这种使用 SSE 处理数组尾部的方法是否矫枉过正?