为什么10号的权力在科学记数法中以第5次方打印?

我想知道在控制台中是否以及如何将10个人的权力与科学记谱法的印刷相关联。 我search了R的文档,没有find任何相关的,或者我真的明白。

首先,我的scipendigits设置是

 unlist(options("scipen", "digits")) # scipen digits # 0 7 

现在,10次幂正常打印到4次幂,然后打印5次幂切换到科学记数法。

 10^(1:4) # [1] 10 100 1000 10000 10^(1:5) # [1] 1e+01 1e+02 1e+03 1e+04 1e+05 

有趣的是,对于大于10的其他数字,这不会发生。

 11^(1:5) # [1] 11 121 1331 14641 161051 

从下面来看,5位数似乎是显着的。

 100^(1:2) # [1] 100 10000 100^(1:3) # [1] 1e+02 1e+04 1e+06 

所以我的问题是:

为什么科学记数法在第四和第五次方之间激活了10次而不是其他次数呢? 数字5是重要的吗? 此外,为什么5而不是一个数字接近22的最大数字选项?

那么,答案其实就是在scipen in的定义中有?options ,尽pipe如果没有scipen一些例子,我们很难理解它的含义:

'scipen':整数。 决定以固定或指数表示法打印数值时应用的惩罚。 积极的价值倾向于固定和消极的科学记数法:固定的符号将是首选,除非它比'scipen'数字更宽。

要看看这意味着什么,请检查以下三对完全相同的数字。 在前两种情况下,固定符号的字符宽度小于或等于科学的固定符号的宽度是优选的

然而在第三种情况下,固定符号更宽(即“大于0位数”),因为使用e+nn代表相同的值的5个零的字符多于4个字符。 因此,在这种情况下, 科学记数法是首选

 1e+03 1000 # [1] 1000 1e+04 10000 # [1] 10000 1e+05 100000 ## <- wider # [1] 1e+05 

接下来,检查一些也以很多零结尾的数字,但是在科学记数法中的表示将需要使用a . 。 对于这些数字,一旦有6个或更多个零(即超过5个字符和1个字符e+nn ),将使用科学记数法。

 1.1e+06 1100000 # [1] 1100000 1.1e+07 11000000 ## <- wider # [1] 1.1e+07 

对于大多数其他数字来说,权衡的推理有点棘手,对于这些数字,两个options("scipen")options("digits")发挥了作用,但总体思路完全相同。

为了看到一些稍微令人惊讶的复杂情况,你可能需要将以下内容粘贴到控制台中(也许在首先尝试预测每个系列内切换到科学记谱法的位置之后)。

 100001 1000001 10000001 100000001 1000000001 10000000001 100000000001 1000000000001 111111 1111111 11111111 111111111 1111111111 11111111111 111111111111 1111111111111 

我很困惑你的问题到底是什么。 或者更具体地说,你将如何使用这个问题的答案以某种方式改变/控制R的行为。你试图以某种方式格式化数字? 有更好的方法来做到这一点。

当你input这样的值时,结果会隐式地通过一个print()命令被“格式化”到控制台上。 每当在屏幕上看起来很“漂亮”的时候,执行该操作的代码通常都很难看。 这里的大部分代码都是由formatReal函数和辅助函数来完成的。 后者跟踪一个数字的以下信息

 /* for a number x , determine * sgn = 1_{x < 0} {0/1} * kpower = Exponent of 10; * nsig = min(R_print.digits, #{significant digits of alpha}) * roundingwidens = 1 if rounding causes x to increase in width, 0 otherwise * * where |x| = alpha * 10^kpower and 1 <= alpha < 10 */ 

然后前一个函数使用这个信息来试图通过平衡小数点左边和右边的值来制作“漂亮”的数字。 这是一个数字的数量级和有效数字的数量,以及scipen选项的环境影响等许多事情的组合。

print()只是为了让事情看起来“很好”。 什么是好的取决于vector中的所有值。 在这个代码中你会发现很less的难题。 这是非常适应性的。 在一般情况下,没有简单的方法来简洁地描述它所做的一切(这就是你所要求的)。

唯一可以肯定的是,如果您需要以特定方式对数字进行格式化,请使用sprintf()formatC() ,以便进行精确控制。

当然,这个行为依赖于class() ,我指出了formatReal东西,因为这是最棘手的事情发生的地方。 但是使用整数时要注意不同之处

 c(10, 100, 1000, 10000, 100000) # [1] 1e+01 1e+02 1e+03 1e+04 1e+05 c(10L, 100L, 1000L, 10000L, 100000L) # [1] 10 100 1000 10000 100000