在下面的示例中可以看到,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
类型(如在这里看到的 )不存在此特性。
发布于 2018-04-16 14:02:30
我没有这方面的文档参考,但一般来说,很难读到很大的数字,或者很小的数字。原因是,由于您可能测试自己,很难计数的零数,当这个数字变得很大。实际上,科学表示法的要点之一是避免写出无关紧要的零。
以数字5.0E-4
为例,我们可以把它写成0.0005
。但是在5
之前的零点是微不足道的,只是告诉我们它是相当小的,从而对测量有贡献。通过将此值写入5.0E-4
,我们将零降为E-4
项,从而使我们能够将重点放在重要的5.0
值上。
至于为什么Java选择它的特定约定,您可能需要问Java的创建者。
发布于 2018-04-16 16:21:07
您可以使用格式化(如String.format
)分别使用%e
或%f
强制进行科学输出或定点输出。例如,只需将最后一行改为
System.out.printf("%.4f\n", num2);
但是,在默认情况下,字符串转换应该使用,您是对的,这种格式对人类读者来说似乎是最“友好”的,并且避免无用的细节。在各种实现中,细节可能略有不同。例如,C标准用于%g
所使用的样式取决于转换的值;只有当由这种转换产生的指数小于−4或大于或等于精度时,才使用样式e(或E)。
(“精度”是一个接一个的参数;例如,在%20.11g
中,精度为11。)
对于具体值的推理,如-4,可以比较F、E和G形式中不同值的表示形式。对于上界,如果指数小于精度,科学的形式是无用的,因为打印的指数是0。对于下界,-4似乎也与指数后缀的长度有关,如e-05
:1e-05被认为比0.00001更好读。
这种三种格式的选择和“G”格式的自适应行为起源于很小的时代,例如20世纪60年代的Fortran
。IBM 4已经提供了这三种格式样式,其基本含义与现在相同。
我ʼ不是一个标准的律师,只有从不同来源收集到的信息才能回答这个问题。要想得到完整的答案,你可以问一个标准制定者。但我希望,我ʼ描述的图片是相当准确的,以探索这个概念。
https://stackoverflow.com/questions/49859085
复制相似问题