【发布时间】:2013-09-08 17:41:49
【问题描述】:
看 Java(但在其他语言中可能相似或相同),long 和 double 都使用 8 个字节来存储一个值。
long 使用 8 个字节来存储从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 的长整数
double 使用 8 个字节来存储从 -1.7E308 到 1.7E308 的双精度浮点数,最多 16 个有效数字。
我的问题是,如果两者都使用相同的字节数(8 字节或 2^64),如何双倍存储更长的数字? 1.7E308 比 9,223,372,036,854,775,807 大得多。
【问题讨论】:
-
因为您可以将 1 加到任何 long 上,但您不能将 1.0 加到某些双精度上,例如 1.6E308。或者,如果您希望能够添加 0.00000000001,那么您的 double 数字不能超过 1.0,这比 long 小得多。
-
浮点数存储在计算机中,相当于指数符号(有点像“1.234E56”,只是二进制)。另一方面,
int或long值存储在计算机中,相当于普通数字(例如,12345678,没有小数点也没有指数)。浮点数/双精度数的范围较大,但精度较小。 -
据我研究,Java double 可以存储 15 位有效十进制数字。但是,长号码最多可以达到 19 位(922,...)。因此,问题应该是“15 位容量如何包含 19 位”。所以,stackoverflow.com/users/2662723/user2662723 的最后一条语句令人困惑。