在Java中,双字面值应该使用多少个有效数字?

在Java中,双字面值应该使用多少个有效数字?,java,literals,significant-digits,Java,Literals,Significant Digits,在Java中定义doubleliteral时应该使用多少个有效数字?这是假设我试图用比一个双精度数字更重要的数字来表示一个数字 在Math.java中,我看到了20和21: public static final double E = 2.7182818284590452354; public static final double PI = 3.14159265358979323846; 这超过了IEEE 754提供的15-17位有效数字。那么,一般的经验法则是什么呢?双精度是有精度的 我无

在Java中定义
double
literal时应该使用多少个有效数字?这是假设我试图用比一个双精度数字更重要的数字来表示一个数字

Math.java
中,我看到了20和21:

public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
这超过了IEEE 754提供的15-17位有效数字。那么,一般的经验法则是什么呢?

双精度是有精度的

我无法回答为什么这些常量显示为20位小数,但您会发现这些数字被删除:


2.7182818284590452354d==2.718281828459045d
如果您阅读了Math.E和Math.PI的javadocs,您将看到以下内容(我的重点):

比任何其他值更接近的双精度值[…]

如果您的文本可以精确地表示为double,那么就这样做。否则,查找最接近的可表示值


当然,根据您的值的使用方式,您是否“仅”精确到(比如)10位有效数字可能并不重要。

首先,我将决定手头的问题需要多少位数字,并以此决定数据类型(可能值得切换到
BigDecimal
)。我不是这方面的专家,但如果您选择13位(?)十六进制数中的十六进制数字是最接近的近似值,将其转换为精确的十进制值,最终得到20-21个十进制数字我不会感到惊讶。另请参阅,我相信这个问题是关于一个文字不能精确表示为双精度的情况。因此,问题是c有多少个有效数字必须指定一个名称。