Java double的内存容量是否存在精度限制?

Java double的内存容量是否存在精度限制?,java,double,Java,Double,我正在读一篇关于Java的文章,遇到了一些我不太理解的东西。在涉及变量类型时,作者指出“单词double表示介于 这让我感到奇怪,因为正如我写的那样,它将包括上述两个限制之间实数线上的所有数字 根据我的理解,double是一种分配了64位内存的原始数据类型。反过来,我很清楚5.9是一个完美的double,或者说float。但是,我不确定这个系列是如何实现的 i、 当k接近无穷大时,e.,5.9,5.99,5.999,5.9999,…将被放入内存中 我的直觉是正确的吗?不是作者两个极限之间的所

我正在读一篇关于Java的文章,遇到了一些我不太理解的东西。在涉及变量类型时,作者指出“单词
double
表示介于

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

根据我的理解,
double
是一种分配了64位内存的原始数据类型。反过来,我很清楚5.9是一个完美的double,或者说float。但是,我不确定这个系列是如何实现的

i、 当k接近无穷大时,e.,5.9,5.99,5.999,5.9999,…将被放入内存中


我的直觉是正确的吗?不是作者两个极限之间的所有实数都可以作为
double
适当地保存在内存中?

的确如此。在一句话中,整数是精确的,而浮点数和double是使用以位表示的科学符号存储的。这意味着,随着科学符号的发展,将出现舍入错误美国

根据维基百科:

符号位:1位

指数宽度:11位

有效位精度:53位(显式存储52位)

一个有趣的提示:指数还有1位存储它的符号

欲了解更多信息:

我的直觉是不是说,并非所有在作者两个极限之间的实数都能作为一个双精度数恰当地保存在记忆中

是的,你说得对

即使是最明显的“double”也无法正确存储。例如,
0.1
是“1/10”-您是否曾在基数为2的系统中除以10?这是一个无穷大的数字(与基数为10的系统中的“/3”相当)

(顺便说一句,这个事实是爱国者病毒的罪魁祸首:)

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

使用您选择的编译器并尝试以下操作:

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

哎呀,它将输出false。

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

为了获得更高、更好的精度,可以使用java.math包中的BigDecimal类。