控制R中打印输出的小数位数

控制R中打印输出的小数位数,r,precision,digits,r-faq,output-formatting,R,Precision,Digits,R Faq,Output Formatting,R中有一个选项可以控制数字显示。例如: options(digits=10) 应给出10位数的计算结果,直到R会话结束。在R的帮助文件中,digits参数的定义如下: 位数:控制位数 在打印数值时打印。 这只是一个建议。有效值 默认值为1…22,默认值为7 所以,它说这只是一个建议。如果我希望始终显示10位数字,而不是更多或更少,该怎么办 我的第二个问题是,如果我想显示超过22位的数据,例如,对于100位这样更精确的计算,该怎么办?是否可以使用base R,或者我是否需要一个额外的包/函数 编

R中有一个选项可以控制数字显示。例如:

options(digits=10)
应给出10位数的计算结果,直到R会话结束。在R的帮助文件中,digits参数的定义如下:

位数:控制位数 在打印数值时打印。 这只是一个建议。有效值 默认值为1…22,默认值为7

所以,它说这只是一个建议。如果我希望始终显示10位数字,而不是更多或更少,该怎么办

我的第二个问题是,如果我想显示超过22位的数据,例如,对于100位这样更精确的计算,该怎么办?是否可以使用base R,或者我是否需要一个额外的包/函数

编辑:多亏了jmoy的建议,我尝试了
sprintf(“%.100f”,pi)
,它给出了

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

它有48个小数。这是R可以处理的最大限制吗?

如果您自己生成整个输出,您可以使用
sprintf()
,例如

> sprintf("%.10f",0.25)
[1] "0.2500000000"
指定要用十个小数点格式化浮点数(在
%.10f
中,
f
用于浮点,
.10
指定十个小数点)

我不知道有什么方法可以强迫R的高级函数打印出精确的位数


如果您正在打印R的常用数字,则显示100位数字是没有意义的,因为使用64位双精度可以获得的最佳精度约为16位十进制数字(请查看系统上的.Machine$double.eps)。剩下的数字将只是垃圾。

这只是一个建议,因为您可以很容易地编写一个忽略选项值的打印函数。内置的打印和格式化功能使用
选项
值作为默认值

至于第二个问题,由于R使用有限精度算术,您的答案的精度不会超过15或16位小数,因此一般来说,不需要更多。和包处理多精度算术(通过gmp库的交互),但这主要与大整数有关,而不是与双精度的小数位数有关

或者允许你给你的心想要的小数位数

编辑:
考虑小数位和有效数字之间的差异可能是有用的。如果你做的统计测试依赖于超过第15个有效数字的差异,那么你的分析几乎肯定是垃圾

另一方面,如果您只是处理非常小的数字,那么问题就不那么严重了,因为R可以处理小到
.Machine$double.xmin
(通常是2e-308)的数字

比较这两种分析

x1 <- rnorm(50, 1, 1e-15)
y1 <- rnorm(50, 1 + 1e-15, 1e-15)
t.test(x1, y1)  #Should throw an error

x2 <- rnorm(50, 0, 1e-15)
y2 <- rnorm(50, 1e-15, 1e-15)
t.test(x2, y2)  #ok

与常规(双精度)
数值
向量相比,这些向量的使用速度较慢,内存占用更大,但如果您遇到条件较差的问题或算法不稳定,则这些向量可能会很有用。

还有一种解决方案能够根据需要控制打印出的小数位数(如果您不想打印多余的零)

例如,如果您有一个向量作为
元素
,并且希望得到它的

elements <- c(-1e-05, -2e-04, -3e-03, -4e-02, -5e-01, -6e+00, -7e+01, -8e+02)
sum(elements)
## -876.5432

我们可以根据每次查询更改
decimal\u长度
,这样就可以满足不同的十进制打印要求。

实际上,我应用的一些特殊卡方检验需要数百位小数才能给出准确的结果。此外,π有数千个小数。这就是为什么我想知道大约100或更多的数字。π有无穷多的小数;这并不意味着计算机可以存储它们。我想这是一种Mathematica优于R的情况。@skan你认为Mathematica可以存储无限多的小数吗?@Gregor当然不能,但你可以根据你的内存允许存储多少位数。只有pi的前15位数是准确的。与真实值相比,你是对的。为什么R与之不同?请参阅R上的常见问题解答:我认为您误解了R中数字的计算表示形式。您可能想阅读。作为比较,Python的做法完全相同:尝试
Python-c“导入数学;打印(格式(math.pi,.100f')”
。结果是
pi
带有48个“实”小数,剩余的52位由零填充。如所示,允许在R中使用高精度浮点运算。但是任何R包都可以使用Rmpfr来提高其精度吗?或者它只能使用内部编码的函数?我只是想,“如果你做的统计测试依赖于超过15个有效数字的差异,那么你的分析几乎肯定是垃圾。”但我想知道我得出垃圾结论的位数是多少,我想是5,但我很乐意接受纠正。
elements <- c(-1e-05, -2e-04, -3e-03, -4e-02, -5e-01, -6e+00, -7e+01, -8e+02)
sum(elements)
## -876.5432
decimal_length <- 5
formatC(sum(elements), format = "f", digits = decimal_length)
## -876.54321