我有一个数字,例如1.128347132904321674821,在输出到屏幕(或写入文件)时,我只想显示两位小数。如何做到这一点?

x <- 1.128347132904321674821


编辑:

使用:

options(digits=2)


建议作为可能的答案。有没有一种方法可以在脚本中指定一次以供使用?当我将其添加到脚本中时,它似乎并没有做任何不同的事情,并且我对重新格式化每个数字的格式不感兴趣(我正在自动处理一个非常大的报告)。

-

答案:round(x,digits = 2)

评论

相关问题:stackoverflow.com/questions/2287616/…

如果使用选项(数字= 4),那不将计算限制为4位数,是吗?在这种情况下,它将使程序的准确性大大降低。仅影响打印时的编号,对吗?

控制打印数值时要打印的位数。这只是一个建议。有效值为1 ... 22,默认值为7。有关大于15的值,请参见print.default中的注释。?选项仅影响输出。

请注意,round(23,digits = 2)将打印23,而不是23.00。如果需要后者,请尝试stackoverflow.com/a/12135122/180892

@PaulHurleyuk,我认为在编程中最好使用尽可能少的库。对于每个琐碎的需求使用不同库的人通常会陷入混乱,文件过大,可移植性问题等问题。

#1 楼

背景:此页面上建议的某些答案(例如signifoptions(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))


例如,

specify_decimal(1234, 5)
# [1] "1234.00000"
specify_decimal(0.1234, 5)
# [1] "0.12340"


评论


+1只对我有用的答案,将0.0001正确打印为0.00

– ThomasH
2012年12月6日在17:42

总是困扰我的是诸如format()和prettyNum()之类的函数如何将数字转换为字符。您将如何解决?

– Waldir Leoncio
15年3月6日在14:19

出现的报价是什么?

– F.Webber
17年5月31日在16:14

@JeromyAnglim我注意到上面的解决方案可能存在边缘情况的缺点,即固定小数点前的字符数,例如format(c(10,1),nsmall = 1)产生“ 10.0”“ 1.0”(请注意1.0的前导空格。而sprintf()函数似乎可以保证小数点两侧的格式更好,例如sprintf(c(10,1),fmt ='%#。1f')摆脱了那个讨厌的前导空间,并返回“ 10.0”“ 1.0”。

–尼古拉斯·G·赖希(Nicholas G Reich)
18-10-31在15:42



前导空格是一种用于在列中使用格式结果时对齐小数点的功能。

–居民
19年5月25日在15:29

#2 楼

您可以根据需要设置数字格式,例如x,最多可以保留小数位。 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
17-12-27在20:42



你们每个人都可以帮忙吗? stackoverflow.com/q/53279593/5224236

– CatalystRPA
18年11月13日在20:50

#3 楼

您可以尝试使用我的包格式表。

> # 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


评论


整个上午,这样的小刺痛都困扰着我。由于某些原因,R只会将某列的显示取整。我需要此修复程序,因为我也必须对这些列执行计算。这有效。谢谢 !

–thethakuri
16-10-7在7:24

我比任何baseR函数都喜欢formattable。它的最大优点是将变量保留为数字。

–拉撒路·瑟斯顿(Lazarus Thurston)
19-10-16在14:54



#4 楼

假设要保留尾随零作为小数点后2位

sprintf(5.5, fmt = '%#.2f')


给出

[1] "5.50"


与@ mpag在下面提到,似乎R有时可以使用this和round方法给出意外的值,例如sprintf(5.5550,fmt ='%#。2f')给出5.55,而不是5.56

评论


但是,尽管sprintf进行了四舍五入,但sprintf(5.5550,fmt ='%#。2f')给出了一个意外的结果:5.55。 sprintf(5.555000000001,fmt ='%#。2f')得到5.56。这似乎是在R中进行四舍五入的一般“问题”,因为舍入nsmall方法给出了相同的结果。

–mpag
18-3-23在18:22



感谢@mpag,我不知道R在边界上取整很费力,我只是用5.565进行了尝试,该函数可以四舍五入,而5.545可以四舍五入。我想这就是他们处理浮点精度的方式。我认为我没有在其他语言中看到过这种行为,我想这意味着它们具有内置的解决方法

–马克·亚当森
18-3-24在21:32



我认为他们是故意将值视作精度程度的限制。他们认为5.555的实际值与5.5554的“实际”值5.5546相同。但是,如果继续进行这种四舍五入游戏,则如果一次执行一位数,则5.444445可能(未经测试)最终显示为“ 6”。但是您可能是对的,因为二进制表示形式可能低于或高于5.55。

–mpag
18 Mar 25 '18在21:06

是的,我认为如果是有意的,则在5.565和5.545之间也将保持一致。 “随机性”对我来说是一个浮点数表示法。

–马克·亚当森
18年4月5日在11:48

你们每个人都可以帮忙吗? stackoverflow.com/q/53279593/5224236

– CatalystRPA
18年11月13日在20:50

#5 楼

像这样的东西:

options(digits=2)


数字的定义选项:

digits: controls the number of digits to print when printing numeric values.


评论


运行脚本时,有什么方法可以动态设置此设置?

–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月9日在20:23

这适用于R控制台中的输出,但不适用于我的脚本(它们仍然带有.1289273982)

–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月9日在20:48

我有一个奇怪的行为,digits选项似乎没有设置小数点后的位数。例如,当我设置options(digits = 2)时,则打印7.25会导致输出7.2,1234.25变为1234,而0.25则保持0.25。是否有其他选择与此交互?

–Maxim.K
2014年9月22日在8:20

#6 楼

检查函数prettyNum,格式为

以具有试验零(例如123.1240),请使用sprintf(x, fmt='%#.4g')

评论


@ 42我会提倡学习sprintf,它基本上是格式化框架

– jangorecki
16年3月24日在20:40

@jangorecki我不确定你的意思。我所做的(5年前)只是建议进行拼写更正。

– IRTFM
16 Mar 24 '16 at 20:49

@ 42我要你在fmt arg上抱怨,对不起!

– jangorecki
16 Mar 24 '22 at 22:24

我认为OP在固定小数点后而不是固定数字后。您的答案中的g似乎是固定数字,使用f效果更好。

–马克·亚当森
18年3月4日在16:29

#7 楼

如果您更希望使用有效数字而不是固定数字,那么signif命令可能会有用:

> signif(1.12345, digits = 3)
[1] 1.12
> signif(12.12345, digits = 3)
[1] 12.1
> signif(12345.12345, digits = 3)
[1] 12300


评论


谢谢保罗。这两个并不是我要找的东西,但是signif使我进入了round(),这正是我所需要的。干杯,

–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月9日在21:17

错误:找不到功能“已修复”

– ThomasH
2012年12月6日17:40

signif适用于所提供的特定数字,但我认为常见的应用问题是何时需要精确显示两位小数,但您不知道提前多少。在这种情况下,signif将根据实际数字给出不同的小数位数。

–杰里姆·安格利
2012年12月7日在4:57

在任何地方都找不到固定的。请修复它,否则应删除此误导性答案。

–小型国际象棋
16-4-24在12:33



@JeromyAnglim我们想要3sf时如何解决?有时它给我3sf,其他时候给我4sf,等等。我们该如何解决?

–christouandr7
3月28日12:06



#8 楼

功能formatC()可用于将数字格式化为两位小数。即使结果值包含尾随零,此函数也会给出小数点后两位。

#9 楼

我将此变量用于强制打印K个小数位:

# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)


#10 楼

请注意,R中的数字对象以双精度存储,这使您(大约)具有16个十进制数字的精度-其余的将是噪声。我认为上面显示的数字可能仅是示例,但它的长度为22位。

评论


确认,仅作为示例。我捣毁了键盘。

–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月10日在16:46

#11 楼

在我看来,应该有点像

library(tutoR)
format(1.128347132904321674821, 2)


每一点在线帮助。

评论


我找到了这个,但是它需要一个包装,我正在基本包装中寻找东西。

–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月9日20:19

@ brandon,format()是基础的一部分。打开R并输入?format ...不需要软件包。

–JD Long
2010年8月9日在20:38

嗯,你看得出的结果了吗? [1]“ 1.128347”否则,您认为它位于基本程序包中是正确的,我很糟糕。

–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月10日在1:24

也许尝试format.default(x,digits = 2)只是在黑暗中一枪,尽管基于提供的链接。该信息是我通常在阅读文档时所缺少的,我希望也能看到印刷输出。

– Tim Meers
2010年8月10日在14:08

刚刚注意到,您的链接指向tutoR文档,该文档不属于基础。

–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月10日17:09

#12 楼

如果只想四舍五入一个数字或一个列表,只需使用

round(data, 2)


,那么数据将四舍五入到小数点后两位。

#13 楼

这是我从单位到数百万的方法。
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)
}