double 的内存容量有精度限制吗?

Are there limits of precision on the memory capacity of double?

我正在阅读关于 Java 和 运行 的 introductory book 内容,我不太明白。在介绍变量类型时,作者指出“单词 double 代表介于

这让我觉得很奇怪,因为正如所写的那样,它将包括上述两个限制之间的实数线上的所有数字。

根据我的理解,double 是分配了 64 位内存的原始数据类型。反过来,我很清楚 5.9 是一个非常好的双精度值,或者就此而言是浮点数。但是,我不确定系列

即 5.9, 5.99, 5.999, 5.9999, ... 适合内存,因为 k 接近无穷大。

我的直觉是否正确,作者的两个限制之间的 所有 实数都不会作为 double 适当地保存在内存中?

确实如此。一句话,整数是精确的,而浮点数和双精度数是使用以位表示的科学记数法存储的。这意味着会有一个舍入误差,就像科学记数法一样。

根据维基百科:

Sign bit: 1 bit

Exponent width: 11 bits

Significand precision: 53 bits (52 explicitly stored)

一个有趣的注意事项:指数也有 1 位存储其符号!

阅读更多: Wikipedia - Double precision floating point format

Is my intuition that not all real numbers between the author's two limits would be appropriately held in memory as a double?

是的,你是对的。

即使是最明显的 "doubles" 也无法正确存储。例如 0.1 是“1/10”——你有没有在 base-2 系统中除以 10?这是一个无穷大的数字(相当于以 10 为基数的系统中的“/3”)

(顺便说一句,这个事实是爱国者虫的罪魁祸首:http://sydney.edu.au/engineering/it/~alum/patriot_bug.html

因此,即使是一些显而易见的简单数学运算也会在 java 上出错:

使用你选择的编译器试试这个:

System.out.println(0.8 == (0.1 + 0.7));

糟糕,它会输出 false。

double数据类型为双精度64位(8字节)IEEE-754浮点格式point.The由1位符号,11位指数,其余52位有效数字代表小数部分。由于小数有效位的 52 位出现在内存格式中,因此总精度为 53 位(大约 16 位十进制数字,53 log10(2) ≈ 15.955)。指数的 11 位宽度允许用 10E−308 和 10E+308 之间的十进制指数表示数字,具有完整的 15-17 位十进制数字精度。 double 和 float 不完全是实数 numbers.There 可以是任何范围内的无限数量的实数,但应该始终牢记,只有有限数量的位来表示它们,因此并非所有数字都可以表示.

为了获得更高更好的精度,您可以使用 java.math 包中的 BigDecimal class。 http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html