我有一个数字,例如1.128347132904321674821,我想在输出到屏幕(或写入文件)时只显示两位小数。怎么做到这一点?
x <- 1.128347132904321674821
编辑:
使用:
options(digits=2)
已被建议作为可能的答案。有没有办法在脚本中指定一次性使用?当我将它添加到我的脚本时,它似乎没有做任何不同的事情,我对很多重新键入格式化每个数字感兴趣(我正在自动化一个非常大的报告)。
-
答案:round(x,digits = 2)
答案 0 :(得分:327)
背景:此页面上建议的某些答案(例如signif
,options(digits=...)
)并不保证为任意数字显示一定数量的小数。我认为这是R中的一个设计特征,其中良好的科学实践涉及根据“significant figures”的原则显示一定数量的数字。但是,在许多域(例如,APA style,业务报告)格式要求中,要求显示一定数量的小数位。这通常是为了一致性和标准化目的而不是关注重要数据。
<强>解决方案强>:
以下代码正好显示了数字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))
如,
specify_decimal(1234, 5)
# [1] "1234.00000"
specify_decimal(0.1234, 5)
# [1] "0.12340"
答案 1 :(得分:25)
您可以根据需要格式化数字,例如x
,最多小数位数。这里x
是一个带有许多小数位的数字。假设我们希望显示此数字的最多8个小数位:
x = 1111111234.6547389758965789345
y = formatC(x, digits = 8, format = "f")
# [1] "1111111234.65473890"
这里format="f"
给出通常小数位的浮点数,例如xxx.xxx,digits
指定位数。相比之下,如果您想要显示一个整数,则可以使用format="d"
(非常类似于sprintf
)。
答案 2 :(得分:19)
您可以尝试我的包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
答案 3 :(得分:14)
表示2位小数
sprintf(5.5, fmt = '%#.2f')
给出了
[1] "5.50"
正如@mpag在下面提到的那样,似乎R有时可以用这个和圆形方法给出意想不到的值,例如: sprintf(5.5550,fmt ='%#。2f')给出5.55,而不是5.56
答案 4 :(得分:6)
检查功能 prettyNum,格式
有试用零(例如123.1240)使用sprintf(x, fmt='%#.4g')
答案 5 :(得分:5)
类似的东西:
options(digits=2)
数字选项的定义:
digits: controls the number of digits to print when printing numeric values.
答案 6 :(得分:4)
如果您更喜欢有效数字到固定数字,那么signif命令可能很有用:
> signif(1.12345, digits = 3)
[1] 1.12
> signif(12.12345, digits = 3)
[1] 12.1
> signif(12345.12345, digits = 3)
[1] 12300
答案 7 :(得分:3)
函数formatC()
可用于将数字格式化为两位小数。即使结果值包含尾随零,此函数也会给出两位小数。
答案 8 :(得分:2)
请注意,R中的数字对象与double precision一起存储,它为您提供(大致)16位精度的十进制数字 - 其余为噪声。我承认上面显示的数字可能只是一个例子,但它长22位。
答案 9 :(得分:2)
我使用此变体强制打印K小数位:
# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)
答案 10 :(得分:1)
答案 11 :(得分:1)
如果您只想四舍五入一个数字或一个列表,只需使用
round(data, 2)
然后,数据将四舍五入到小数点后两位。
答案 12 :(得分:0)
这是我从单位到数百万的处理方法。 digits参数让我调整有效值的最小数量(整数+小数)。您可以先在内部调整小数舍入。
number <-function(number){
result <- if_else(
abs(number) < 1000000,
format(
number, digits = 3,
big.mark = ".",
decimal.mark = ","
),
paste0(
format(
number/1000000,
digits = 3,
drop0trailing = TRUE,
big.mark = ".",
decimal.mark = ","
),
"MM"
)
)
# result <- paste0("$", result)
return(result)
}
答案 13 :(得分:0)
我写了这个可以改进的函数,但看起来在极端情况下效果很好。例如,在 0.9995 的情况下,投票正确的答案给了我们 1.00,这是不正确的。在数字没有小数的情况下,我使用该解决方案。
round_correct <- function(x, digits, chars = TRUE) {
if(grepl(x = x, pattern = "\\.")) {
y <- as.character(x)
pos <- grep(unlist(strsplit(x = y, split = "")), pattern = "\\.", value = FALSE)
if(chars) {
return(substr(x = x, start = 1, stop = pos + digits))
}
return(
as.numeric(substr(x = x, start = 1, stop = pos + digits))
)
} else {
return(
format(round(x, 2), nsmall = 2)
)
}
}
示例:
round_correct(10.59648, digits = 2)
[1] "10.59"
round_correct(0.9995, digits = 2)
[1] "0.99"
round_correct(10, digits = 2)
[1] "10.00"