【发布时间】:2025-12-31 01:05:11
【问题描述】:
我一眼就可以轻松地将2e15 解读为“2 万亿”,但对于2000000000000000,我必须数零,这需要更长的时间并且可能导致错误。
为什么我不能使用诸如2e9 或1.3e6 之类的文字来声明int 或long?我知道 10 的负幂,例如 2e-3,或小于小数位数的 10 的幂,例如 1.0003e3,会产生浮点数,但为什么 Java 不允许这样的声明,并在结果值非整数的情况下简单地截断浮点部分并发出温和的警告?
这是一个坏主意是否有技术原因,或者这完全与类型安全有关?编译器简单地解析像
这样的语句不是很简单吗?long x = 2e12 为long x = 2000000000000 //OK for long
和int y = 2.1234e3 作为int y = 2123.4 //warning: loss of precision
【问题讨论】:
-
Eric Lippert:“我经常被问到为什么编译器不实现这个或那个特性,当然答案总是一样的:因为没有人实现它。 功能一开始是未实现的,只有在人们努力实现它们时才会实现:不努力,没有功能。当然,这是一个不令人满意的答案,因为通常提出问题的人会假设该功能是如此明显很好,我们需要有理由不实施它。”
-
@BrianRoach:我知道整数是什么。我在问是否有特定原因说明为什么以浮点形式表示但评估为 integral 值的数字例如:
2.3e3 == 2300不能在没有显式转换的情况下分配。也许原因只是约翰·库格曼引用的。这是有道理的。我问的原因只是我很好奇这样的功能是否有技术原因会是一个坏主意。 -
不,我得到了第一部分......但这不是你的第二个例子;
int y = 2123.4 -
@BrianRoach 在我的第二个示例中,我建议编译器将使用分配给整数的科学记数法对非整数表达式发出警告,而第一个示例中的表达式被确定为整数值,因此可以分配给整数类型而不会损失任何精度。我了解 Java 不允许在没有显式转换的情况下进行此类分配;我只是对所涉及的设计决策感到好奇。
标签: java integer long-integer scientific-notation exponent