我有一个数字,例如1.128347132904321674821,我希望在输出到屏幕上(或写入文件)时只显示两位小数。如何做到?
x <- 1.128347132904321674821
编辑:
使用:
options(digits=2)
已经被建议作为可能的答案。是否有一种方法可以在脚本中指定它以供一次性使用?当我将其添加到我的脚本中时,它似乎没有任何不同的操作,并且我不想重新键入大量格式化每个数字(我正在自动化一个非常大的报告)。--
回答:round(x,digits = 2)
我有一个数字,例如1.128347132904321674821,我希望在输出到屏幕上(或写入文件)时只显示两位小数。如何做到?
x <- 1.128347132904321674821
编辑:
使用:
options(digits=2)
已经被建议作为可能的答案。是否有一种方法可以在脚本中指定它以供一次性使用?当我将其添加到我的脚本中时,它似乎没有任何不同的操作,并且我不想重新键入大量格式化每个数字(我正在自动化一个非常大的报告)。signif
,options(digits=...)
)并不保证以任意数字为基础来显示一定数量的小数位。我认为这是 R 的设计特性,其中遵循科学实践原则需要显示一定数量的数字,这基于“有效数字”的原则。然而,在许多领域中(如APA 样式,商业报告),格式要求指定显示一定数量的小数位。通常这样做是为了保持一致性和标准化而不是关注有效数字。
解决方案:
以下代码为数字x
精确显示两个小数位。
format(round(x, 2), nsmall = 2)
format(round(1.20, 2), nsmall = 2)
# [1] "1.20"
format(round(1, 2), nsmall = 2)
# [1] "1.00"
format(round(1.1234, 2), nsmall = 2)
# [1] "1.12"
x
是数字,k
是要显示的小数位数。trimws
会删除任何前导空格,如果您有一个数字向量,这可能非常有用。specify_decimal <- function(x, k) trimws(format(round(x, k), nsmall=k))
E.g.,
specify_decimal(1234, 5)
# [1] "1234.00000"
specify_decimal(0.1234, 5)
# [1] "0.12340"
备选方案讨论:
formatC答案和sprintf答案都能够较好地解决问题。但在某些情况下,它们会显示不必要的负零。也就是说:
formatC(c(-0.001), digits = 2, format = "f")
# [1] "-0.00"
sprintf(-0.001, fmt = '%#.2f')
# [1] "-0.00"
解决这个问题的一个可能方法如下:
formatC(as.numeric(as.character(round(-.001, 2))), digits = 2, format = "f")
# [1] "0.00"
format()
和 prettyNum()
这样的函数将数值转换为字符,这一直让我困扰。您会如何解决这个问题? - Waldir Leoncioformat(c(10, 1), nsmall=1)
会产生 "10.0" " 1.0"
(请注意1.0前面的空格)。而sprintf()
函数似乎保证了小数点两侧更好的格式,例如sprintf(c(10,1), fmt = '%#.1f')
可以去掉那个讨厌的前导空格,并返回"10.0" "1.0"
。 - Nicholas G Reichformat
格式化结果时,在列中对齐小数点。 - Inhabitant您可以根据自己的需要将一个数字格式化为指定小数位数。这里的x
是一个带有许多小数位的数字。假设我们希望显示该数字的8位小数:
x = 1111111234.6547389758965789345
y = formatC(x, digits = 8, format = "f")
# [1] "1111111234.65473890"
在这里,format="f"
会以通常小数点后的数字显示浮点数,例如xxx.xxx,而digits
则指定了显示的位数。相反地,如果你想要显示一个整数,你应该使用format="d"
(就像sprintf
一样)。
formatC
几乎是我用于此目的的唯一选择。我认为这个答案很好,并且符合OP的要求使用基本R。 - AdamO你可以尝试使用我的包 formattable。
> # devtools::install_github("renkun-ken/formattable")
> library(formattable)
> x <- formattable(1.128347132904321674821, digits = 2, format = "f")
> x
[1] 1.13
好的一点是,x
仍然是一个数值向量,您可以使用相同的格式进行更多计算。
> x + 1
[1] 2.13
更好的是,这些数字不会丢失,你随时可以重新格式化并增加更多的数字 :)
> formattable(x, digits = 6, format = "f")
[1] 1.128347
保留尾随零的情况下保留2位小数
sprintf(5.5, fmt = '%#.2f')
提供
[1] "5.50"
正如@mpag在下面提到的,似乎R有时会在使用此方法和round方法时给出意外的值,例如sprintf(5.5550,fmt ='%#.2f')会给出5.55而不是5.56
类似这样:
options(digits=2)
digits选项的定义:
digits: controls the number of digits to print when printing numeric values.
digits
选项似乎不能设置小数点后的位数。例如,当我设置options(digits = 2)
时,打印7.25的结果是7.2,1234.25变成了1234,而0.25仍然是0.25。是否有其他选项与此交互? - Maxim.K> signif(1.12345, digits = 3)
[1] 1.12
> signif(12.12345, digits = 3)
[1] 12.1
> signif(12345.12345, digits = 3)
[1] 12300
signif
函数适用于特定的数字,但我猜想常见的应用问题是当你需要显示恰好两位小数,但事先不知道数字时。在这种情况下,signif
将根据实际数字给出不同数量的小数位数。 - Jeromy Anglim检查函数prettyNum, format
如果需要保留尾部零(例如123.1240),使用sprintf(x, fmt='%#.4g')
sprintf
,它基本上是一个格式化框架。 - jangoreckifmt
参数,抱歉! - jangoreckig
似乎是用于固定数字的,使用f
更好。 - Mark Adamson函数formatC()
可用于将数字格式化为两位小数。即使结果值包含尾随零,此函数也会给出两位小数。
# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)
round(23, digits=2)
将打印23
而不是23.00
。如果您想要后者,请尝试https://dev59.com/C3A75IYBdhLWcg3wJFqY#12135122。 - Jeromy Anglim