Java 为什么浮点基元类型在被10的某些倍数除和乘时会以科学记数法显示?
在下面的示例中,我们可以看到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
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已经提供了这三种格式样式,其基本含义与现在相同
我不是一个标准的律师,我只是根据从不同来源收集的信息来回答这个问题。要获得完整的答案,您可以询问标准制造商。但我希望我所描述的图片能更准确地理解这个概念