我试图使用Rmpfr库的round()功能应用一轮一半甚至统治,实现正确的结果,而不会由于浮点值的有限精度误差,描述在这里.
到目前为止,这是我所取得的成就:
library(Rmpfr)
x <- c(1.225, 1.2225, 1.22225, 1.222225)
n <- c(2, 3, 4, 5)
round2 <- function(x, n){
sprintf(paste("%#.", n, "f", sep=""), round(mpfr(as.character(x), 200), n))
}
mapply(round2, x, n)
#[1] "1.22" "1.222" "1.2222" "1.22222"
Run Code Online (Sandbox Code Playgroud)
但在某些情况下,我没有得到预期的结果:
round2(1.152, 2)# Should be 1.15
#[1] "1.16"
Run Code Online (Sandbox Code Playgroud)
阅读Rmpfr文档,在roundMpfr()函数中,它说:
mpfr类组方法Math2实现了一种舍入到十进制数字的舍入(x,数字)方法.
但我无法想象如何使用它.
如何使用Rmpfr?获得所需的圆形结果?
默认情况下,R使用圆形一半甚至是round()函数.但是当舍入到定义的小数位数时似乎并不总是这样:
# R code
round(1.225,2)
#[1] 1.23
round(1.2225,3)
#[1] 1.222
round(1.22225,4)
#[1] 1.2223
round(1.222225,5)
#[1] 1.22222
Run Code Online (Sandbox Code Playgroud)
与python相比,使用十进制模块:
# Python code
import decimal
a = decimal.Decimal("1.225")
b = decimal.Decimal("1.2225")
c = decimal.Decimal("1.22225")
d = decimal.Decimal("1.222225")
a.quantize(decimal.Decimal('1.00'), decimal.ROUND_HALF_EVEN)
#Decimal('1.22')
b.quantize(decimal.Decimal('1.000'), decimal.ROUND_HALF_EVEN)
#Decimal('1.222')
c.quantize(decimal.Decimal('1.0000'), decimal.ROUND_HALF_EVEN)
#Decimal('1.2222')
d.quantize(decimal.Decimal('1.00000'), decimal.ROUND_HALF_EVEN)
#Decimal('1.22222')
Run Code Online (Sandbox Code Playgroud)
从python十进制库文档,关于量化函数:
舍入后返回一个等于第一个操作数的值,并具有第二个操作数的指数.
我不确定我是否正确,但看起来python结果是正确的.
题:
哪一个是正确的,以及如何使用这两种语言实现正确的结果?