为啥 +e 取消而 -e 不取消?

Posted

技术标签:

【中文标题】为啥 +e 取消而 -e 不取消?【英文标题】:Why does +e canceled and -e not?为什么 +e 取消而 -e 不取消? 【发布时间】:2018-07-20 16:58:57 【问题描述】:
System.out.println(2e+5);

上面一行的输出是,

200000.0

虽然在下面一行,

System.out.println(2e-5);

输出是,

2.0e-5

为什么2e-5没有解决-10^5给出的输出,

0.00002

【问题讨论】:

一个原因可能是,在第一种情况下,额外的数字可能包含重要信息,而在第二种情况下,它们始终为零。 因为您依赖于默认格式规则。 2e-5double 文字 - 它是 64 一个和零。没有格式,没有符号,没有小数点。它在打印时的表现方式就是这样,一种表现形式。毫无意义。 @Henry 2eanything 中的多余数字将始终为零... @BoristheSpider 在这种情况下是的,但以 1.23456e5 和 1.23456e-5 为例。 在这两种情况下,您都显示了以 6 s.f. 表示的数字。 @亨利。所有数字都很重要——这就是“s”的意思!我真的不明白你的意思。 【参考方案1】:

因为这就是 Double 类的设计者chose to implement it:

[...]

如果m大于等于10-3但小于107,则表示为m的整数部分,以十进制形式表示,没有前导零,后跟“。” ('\u002E'),后跟一个或多个小数位,表示 m 的小数部分。 如果 m 小于 10-3 或大于或等于 107,则它以所谓的“计算机科学计数法”表示。 [...]

当然,他们本可以做出其他选择,但事实就是如此。

如文档所述,如果您需要特定格式,请使用 NumberFormat 格式化您的双精度。

【讨论】:

【参考方案2】:

正如@Nizet 已经指出的那样,将双精度转换为字符串时,如果位数很大,则输出将具有科学计数法。这不仅适用于小数。

考虑:

double d = 1500000000;
System.out.println(String.valueOf(d));

这将打印1.5E9

如果您希望以可读格式进行转换,请使用String.format

System.out.println(String.format ("%.0f", d));

将打印1500000000

【讨论】:

以上是关于为啥 +e 取消而 -e 不取消?的主要内容,如果未能解决你的问题,请参考以下文章