为啥 +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-5
是 double
文字 - 它是 64
一个和零。没有格式,没有符号,没有小数点。它在打印时的表现方式就是这样,一种表现形式。毫无意义。
@Henry 2e
anything 中的多余数字将始终为零...
@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 不取消?的主要内容,如果未能解决你的问题,请参考以下文章