如何格式化具有指定精度级别的数字?

Posted

技术标签:

【中文标题】如何格式化具有指定精度级别的数字?【英文标题】:How to format a number with specified level of precision? 【发布时间】:2011-03-07 22:14:35 【问题描述】:

我想创建一个函数,它返回一个数字向量,其精度反映在只有 n 个有效数字,但没有尾随零,而且不是科学计数法

例如,我想要

somenumbers <- c(0.000001234567, 1234567.89)
myformat(x = somenumbers, n = 3)

返回

[1] 0.00000123  1230000

我一直在玩 formatformatCsprintf,但他们似乎不想独立处理每个数字,他们将数字作为字符串(引号)返回。

这是我得到的最接近的例子:

> format(signif(somenumbers,4), scientific=FALSE)
[1] "      0.000001235" "1235000.000000000"

【问题讨论】:

另外,options(digits=5) 在某些情况下可能有用。 【参考方案1】:

您可以使用 signif 函数四舍五入到给定数量的有效数字。如果您不想要额外的尾随 0,则不要“打印”结果,而是对它们执行其他操作。

> somenumbers <- c(0.000001234567, 1234567.89) 
> options(scipen=5)
> cat(signif(somenumbers,3),'\n')
0.00000123 1230000 
> 

【讨论】:

【参考方案2】:

sprintf 似乎做到了:

sprintf(c("%1.8f", "%1.0f"), signif(somenumbers, 3))
[1] "0.00000123" "1230000"

【讨论】:

【参考方案3】:

怎么样

myformat <- function(x, n) 
    noquote(sapply(a,function(x) format(signif(x,2), scientific=FALSE)))

【讨论】:

效果很好,但我希望它返回一个数字向量

以上是关于如何格式化具有指定精度级别的数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用复合文字来“fprintf()”具有任意基数的多个格式化数字?

如何在 Lisp 中格式化 REPL 输出的数字精度?

如何通过格式化将双精度数转两位小数,然后使用数字?

如何在 Delphi 中将浮点数转换为字符串,指定有效数字,而不是十进制数字(而不是 G 格式)

如何将 C++ 数字格式设置为一定精度?

具有任意精度和一定比例的数字格式的 Oracle to_char 函数