【问题标题】:Truncate decimal to specified places将小数截断到指定位置
【发布时间】:2014-04-18 16:29:02
【问题描述】:

这似乎应该是一个相当容易解决的问题,但我很难找到答案。

我有一个包含长小数的向量,我想将其截断为特定的小数位数。我不想四舍五入,而只是删除超出我想要的小数位数的值。

例如,如果我需要 4 个十进制数字,我希望 0.123456789 返回 0.1234。这不是打印特定位数的问题,而是返回截断为给定数字的原始值。

谢谢。

【问题讨论】:

  • 对于预打包的功能,请尝试plyr::round_any(.1234567, accuracy=.0001, f=floor)

标签: r


【解决方案1】:
trunc(x*10^4)/10^4

达到0.1234 的预期效果。

更一般地说,

trunc <- function(x, ..., prec = 0) base::trunc(x * 10^prec, ...) / 10^prec;
print(trunc(0.123456789, prec = 4) # 0.1234
print(trunc(14035, prec = -2), # 14000

【讨论】:

  • 但是:trunc(1234567.2, prec = 5) 给出 1234567。我们不想要“1234567.2”吗?
【解决方案2】:

我使用上述技术很长时间了。有一天,当我将结果复制到文本文件时遇到了一些问题,我以这种方式解决了我的问题:

trunc_number_n_decimals <- function(numberToTrunc, nDecimals){
numberToTrunc <- numberToTrunc + (10^-(nDecimals+5))
splitNumber <- strsplit(x=format(numberToTrunc, digits=20, format=f), split="\\.")[[1]]
  decimalPartTrunc <- substr(x=splitNumber[2], start=1, stop=nDecimals)
  truncatedNumber <- as.numeric(paste0(splitNumber[1], ".", decimalPartTrunc))
  return(truncatedNumber)
}
print(trunc_number_n_decimals(9.1762034354551236, 6), digits=14)
[1] 9.176203
print(trunc_number_n_decimals(9.1762034354551236, 7), digits=14)
[1] 9.1762034
print(trunc_number_n_decimals(9.1762034354551236, 8), digits=14)
[1] 9.17620343
print(trunc_number_n_decimals(9.1762034354551236, 9), digits=14)
[1] 9.176203435

当需要将多位小数的数字(例如 16)写入文件时,此解决方案非常方便。 只需记住在写入文件之前将数字转换为字符串,使用 format()

numberToWrite <- format(trunc_number_n_decimals(9.1762034354551236, 9), digits=20)

【讨论】:

  • 我用了一段时间,但它不能处理很多不同的数字,例如整数、NAN 等等。
  • 感谢@Squeezie,在阅读了您的评论后,我刚刚发现了这个关于整数的问题。现在整数问题和我再次创建测试它的许多其他情况都解决了。不幸的是,它不会创造任何奇迹,但在需要将结果数字写入文件时会避免很多痛苦。
【解决方案3】:

不是最优雅的方式,但它会起作用。

string_it<-sprintf("%06.9f", old_numbers)
pos_list<-gregexpr(pattern="\\.", string_it)
pos<-unlist(lapply(pos_list, '[[', 1)) # This returns a vector with the first 
#elements
#you're probably going to have to play around with the pos- numbers here
new_number<-as.numeric(substring(string_it, pos-1,pos+4)) 

【讨论】:

    猜你喜欢
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多