【问题标题】:Java: Why can't I declare integer types using scientific notation?Java:为什么我不能使用科学计数法声明整数类型?
【发布时间】:2025-12-31 01:05:11
【问题描述】:

我一眼就可以轻松地将2e15 解读为“2 万亿”,但对于2000000000000000,我必须数零,这需要更长的时间并且可能导致错误。

为什么我不能使用诸如2e91.3e6 之类的文字来声明intlong?我知道 10 的负幂,例如 2e-3,或小于小数位数的 10 的幂,例如 1.0003e3,会产生浮点数,但为什么 Java 不允许这样的声明,并在结果值非整数的情况下简单地截断浮点部分并发出温和的警告?

这是一个坏主意是否有技术原因,或者这完全与类型安全有关?编译器简单地解析像

这样的语句不是很简单吗?

long x = 2e12long 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


【解决方案1】:

这是因为当您使用科学记数法时,您会创建 a floating point number(在您的示例中是双精度)。而且您不能将浮点数分配给整数(这将是一个缩小的原始转换,which is not a valid assignment conversion)。

所以这也行不通,例如:

int y = 2d; //can't convert double to int

你有几个选择:

  • 将浮点数显式转换为整数:int y = (int) 2e6;
  • 在 Java 7+ 中使用千位分隔符:int y = 2_000_000;

【讨论】:

  • 您提到的选项易于使用,并且不需要我所说的假设功能。谢谢!
  • @assylias 是的,但是没有小数点且没有df 后缀的数字被假定为int。所以我认为 OP 在问为什么,例如,2e8 不会被解释为int,为什么2e12l 不会被解释为long(这与非科学记数法数字被解释)。所以答案似乎是“Java 编译器设计者在这方面处理 sci 表示法没有技术原因。他们本可以按照 OP 建议的方式做事,但他们没有——也许他们只是没有想到做就是这样。”
  • @yroc 是的,我只是指出规范的相关部分说它不起作用。为什么要这样做,必须向 JDK 开发人员询问。另请参阅问题下的第一条评论。
【解决方案2】:

因为这是Java的一个缺点。

(具体来说,显然有一组用科学记数法表示的文字,它们完全由整数和长整数表示,并且希望有一种方法将这些文字表示为整数和长整数是合理的。但是,在 Java 中没有'这是一种方法,因为由于 Java 的语言定义,所有科学记数法文字都必然是浮点数。)

【讨论】:

    【解决方案3】:

    你在问关于写整数literals的规则。请参阅此参考: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 将科学记数法用作整数文字的能力确实可能使事情变得更容易,但尚未实现。我看不出有任何技术原因会阻止实施此类功能。

    【讨论】:

      最近更新 更多