Java 为什么浮点基元类型在被10的某些倍数除和乘时会以科学记数法显示?

Java 为什么浮点基元类型在被10的某些倍数除和乘时会以科学记数法显示?,java,floating-point,language-design,Java,Floating Point,Language Design,在下面的示例中,我们可以看到Java在某些类型的操作中显示结果时有一个特殊性,这些操作的基元类型具有浮点值,例如10的倍数除法: int num1 = 5; float num2 = num1 / 10000f; System.out.println (num2); 可以说,结果是5.0E-4,而不是0.0005 我知道这是一种科学的表示法,意思是5.0*10^-4,它会产生相同的值,但我不明白为什么Java会在显示中进行这种更改 文件中有一段文字说明: (…)如果m小于10-3或大于或等于1

在下面的示例中,我们可以看到Java在某些类型的操作中显示结果时有一个特殊性,这些操作的基元类型具有浮点值,例如10的倍数除法:

int num1 = 5;
float num2 = num1 / 10000f;
System.out.println (num2);
可以说,结果是
5.0E-4
,而不是
0.0005

我知道这是一种科学的表示法,意思是
5.0*10^-4
,它会产生相同的值,但我不明白为什么Java会在显示中进行这种更改

文件中有一段文字说明:

(…)如果m小于10-3或大于或等于107,则用所谓的“计算机科学符号”表示

在引文中提到的案例中,语言采用这种展示方式是否有任何惯例或官方动机?还是仅仅为了可读性

注意:此功能不适用于
int
long
类型,例如


我没有这方面的文档参考,但一般来说,很难阅读非常大或非常小的数字。原因是,正如您可能测试自己的那样,当零的数量变大时,很难计算出零的数量。事实上,科学记数法的要点之一是避免写不重要的零

以数字
5.0E-4
为例,我们可以将其写成
0.0005
。但是
5
之前的零并不重要,只有告诉我们它相当小,才有助于测量。通过将该值写为
5.0E-4
,我们将零归为
E-4
项,使我们能够关注显著的
5.0


至于Java为什么选择其特定的约定,您可能必须询问Java的创建者。

您可以分别使用
%e
%f
强制使用格式化(如
String.format
)进行科学或定点输出。例如,只需将最后一行更改为

System.out.printf("%.4f\n", num2);
但是,默认情况下,字符串转换应该使用一种对人类读者来说似乎最“友好”的格式,并且避免无用的细节。在不同的实现中,细节可能略有不同。例如,C标准为
%g

使用的样式取决于转换的值;仅当此类转换产生的指数小于时,才使用样式e(或e)−4或大于或等于精度

(“精度”是周期后的参数;例如,
%20.11g
中的精度为11。)

对于具体值的推理,如-4,可以比较“F”、“E”和“G”形式中不同值的表示。对于上界,如果指数小于精度,则科学形式无效,因为打印的指数将为0。对于下限,-4似乎也与指数后缀的长度有关,如
e-05
:1e-05被认为比0.00001更好

三种格式的选择和“G”格式的自适应行为起源于很早的时代,例如20世纪60年代的Fortran。IBMFortran 4已经提供了这三种格式样式,其基本含义与现在相同

我不是一个标准的律师,我只是根据从不同来源收集的信息来回答这个问题。要获得完整的答案,您可以询问标准制造商。但我希望我所描述的图片能更准确地理解这个概念