非常小的小数的最佳Java对象

非常小的小数的最佳Java对象,java,data-structures,decimal,Java,Data Structures,Decimal,哪种java对象最适合保存微小的十进制值,例如10^-25?哪一个对象在使用最少空间的情况下最准确地保持数字的值 我只需要存储值以供显示,而不是用于任何计算。还有其他选择吗?BigDecimal就可以了 BigDecimal dec = BigDecimal.valueOf(1, -25); 与字符串相比,更喜欢此格式的主要原因是您可以更改/自定义格式。如果你把它作为一个字符串保存,在你解析它之前,它将一直以它原来的任何格式存在,这意味着你不能进行本地化等等。如果你真的不需要用这些值进行任何计

哪种java对象最适合保存微小的十进制值,例如10^-25?哪一个对象在使用最少空间的情况下最准确地保持数字的值


我只需要存储值以供显示,而不是用于任何计算。还有其他选择吗?

BigDecimal
就可以了

BigDecimal dec = BigDecimal.valueOf(1, -25);

与字符串相比,更喜欢此格式的主要原因是您可以更改/自定义格式。如果你把它作为一个字符串保存,在你解析它之前,它将一直以它原来的任何格式存在,这意味着你不能进行本地化等等。

如果你真的不需要用这些值进行任何计算,那么一个
字符串将是很粗糙但足够的。或者,您可以使用任意精度类。

将其存储为字符串。如果不进行计算,则无需使用数字数据类型。

在处理十进制数时,始终需要权衡空间和精度。浮点(和双精度浮点)在其范围的最末端精度较低,但比BigDecimal更节省空间。当表示某些数字时,它们可以生成无穷级数(如0.1)


使用BigDecimal。

您可以使用double,如果不够,您还可以使用该类。但是,如果您不计算任何内容,我只会以接收它们的方式将它们存储为字符串。

BigDecimal将非常精确,但(相对而言)会占用大量空间。仅仅一个普通的原始双精度将为您提供15位精度,因此,除非您需要绝对精确的值(如在金融计算中),否则我认为双精度是您的最佳选择

BigDecimal将或多或少地使用“您需要使用的空间”来获得所需精度。我不认为有一个实用的替代方案可以占用这么少的空间,值得一试。@Neil:除非你真的需要超过15位数字,否则很难打败双精度。双精度是8字节。Sun的BigDecimal实现包括两个int成员和两个对象引用;保守地说,这是16个字节。其中一个对象引用总是指向一个BigInteger值,该值包含5个int和一个int[]引用,用于另外24个字节;另外还有对象开销,过去每个对象的开销是16字节,尽管现在可能更小了;让我们把它设为4个字节来表示超级乐观。这意味着可能最小的BigDecimal包含52个字节,实际上大多数字节都要大得多。请记住,double精确地存储了很多二进制数字,而BigDecimal精确地存储了任意数量的十进制数字。即使在给定的精度范围内,它们也不完全相同。我还要说的是,在一个典型的应用程序中,你通常可以负担额外的20-50字节来存储一个数字,当然是一个数字。如果它是一个100000的数组,那么它会产生很大的差异。他提到了空间,所以我才提到它。你完全正确,double不能存储许多非常常见的非重复十进制数的精确值。这是故意的。我很高兴自己错了,但我相信JRE无论如何都会将任何数字数据类型转换为字符串进行输出。以字符串开头会绕过该转换并使用更少的内存。有一条注释是关于忽略字符串对象的大小,现在似乎已丢失。@yock:当我确认BigDecimal开销很大,并且实际上可能会占用普通值的更多平均内存时,我删除了该注释。但是,关于您的注释,将创建用于显示值的字符串不是内存问题;它是暂时的,不是常驻的。暂时记忆通常不是担心的问题,而是长期的需要。对于任意的十进制值,BigDecimal将占用更少的内存。使用字符串的另一个主要缺点是,由于未对其进行解析,您可以更改格式(例如,本地化或首选项)。这可能是OP的问题,也可能不是。了解OP内存限制的性质可能会有所帮助。