使用round()后跟signif()顺序舍入后尾随零

时间:2014-07-24 08:26:59

标签: r rounding trailing significant-digits

我正在尝试对任何实数应用顺序舍入函数,以便满足以下条件:"数字应报告不超过两位小数,且不超过两位有效数字"。

例如:
0.0236应报告为0.02
0.236应报告为0.24
2.36应报告为2.4
23.6应报告为24
236应报告为240

似乎只要在使用roundsignif进行舍入后存在尾随零,就会省略这些零(例如0.90023变为0.9而不是0.90)。我尝试过以下代码:

    my_round <- function(x1) {
            x2 <- formatC(x1, digits=2, format="f", drop0trailing=FALSE)
            x2 <- as.numeric(x2)
            x3 <- formatC(x2, digits=2, format="fg", flag="#", drop0trailing=FALSE)
            x3 <- as.numeric(x3)
            print(x3)
    }

这适用于除195之外的任何数字(整数部分中超过两个有效数字),它仍然是195而不是四舍五入到200.

感谢您就此主题提供的任何帮助 (R v3.1.0,2014-04-10)

3 个答案:

答案 0 :(得分:1)

您可以将功能sprintf与讨论过的问题here结合起来。

ceil.ten <- function(x) 
  if (x > 100) ceiling(x/10)*10 else x

sprintf("%.2f", ceil.ten(0.0236))
# [1] "0.02"
sprintf("%.2f", ceil.ten(0.236))
# [1] "0.24"
sprintf("%.2f", ceil.ten(2.36))
# [1] "2.36"
sprintf("%.2f", ceil.ten(23.6))
# [1] "23.60"
sprintf("%.2f", ceil.ten(236))
# [1] "240.00"
sprintf("%.2f", ceil.ten(195))
# [1] "200.00"

答案 1 :(得分:1)

试试这个:

## Install the prettyprint package
install.packages("devtools")
devtools::install_github("prettyprint/prettyprint")

## 
library(prettyprint)

x = c(0.0236, 0.236, 2.36, 23.6, 236, 0.90023, 195)
pp(x, digits = 2)

输出:

0.02 0.24  2.4   24  240 0.90  200

答案 2 :(得分:0)

对于这个特定问题,似乎有一种可能的解决方案是:

    my_round <- function(x1) {
            x2 <- formatC(x1, digits=2, format="f", drop0trailing=FALSE)
            x2 <- as.numeric(x2)
            if(x2<100) {
                    x3 <- formatC(x2, digits=2, format="fg", flag="#")
                    x3 <- as.numeric(x3)
            }        
               else {
                    x3 <- signif(x2, digits=2)
            }
            print(x3)
     }