在 Java 里,Double(双精度浮点数)有时会用科学计数法显示,并不是因为它“存成了科学计数”,而是在转换成字符串(打印、输出)时,默认格式化方式导致的。
下面分几点说明。
double 在内存中遵循 IEEE 754 标准:
它本质上是一个二进制浮点数,既不是十进制,也不是科学计数法。
double d = 123456789.0;
在内存里只是一个二进制数值,没有“是否科学计数”的概念。
当你看到科学计数法,通常是因为:
System.out.println(d);
或
String s = Double.toString(d);
而 Double.toString() 有固定规则。
如果数值的 绝对值 ≥ 1e7 或 ≤ 1e-3,就使用科学计数法
否则使用普通十进制
例如:
System.out.println(10000000.0); // 1.0E7
System.out.println(0.001); // 0.001
System.out.println(0.0001); // 1.0E-4
这是 JDK 的默认行为,不是 double 本身的问题。
原因主要有三个:
double d = 1.0 / 3;
System.out.println(d);
如果打印成:
0.3333333333333333
会让人误以为“完全精确”,而实际上它是近似值。
科学计数法更符合浮点数“近似”的语义。
double d = 123456789012345.0;
如果完整打印:
123456789012345.0
太长,不利于日志、调试、显示。
科学计数法更紧凑。
在浮点数转字符串时,都倾向于使用科学计数法表示极端值。
如果你不想看到科学计数法,可以手动格式化。
DecimalFormatimport java.text.DecimalFormat;
double d = 1.0E7;
DecimalFormat df = new DecimalFormat("#.#####");
System.out.println(df.format(d));
BigDecimal(推荐用于金额)BigDecimal bd = new BigDecimal("123456789.0");
System.out.println(bd.toPlainString());
String.formatSystem.out.println(String.format("%.2f", d));
Java 的 Double 用科学计数法,不是存储方式的问题,而是输出格式的问题。
Double.toString() 的默认规则如果你愿意,我也可以帮你分析某个具体数值为什么一定会被科学计数,或者讲讲 double 精度陷阱。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。