2014-11-16 105 views
3

默認情況下,R在round()函數上使用round half to even。 但它不似乎四捨五入時定義的小數位數是始終爲真:四捨五入至十進制即使

# 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 

相較於蟒蛇,使用十進制模塊:

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

蟒蛇小數庫文件,約quantize函數:

返回等於舍入後的第一個操作數並具有第二個操作數的指數的值。

我不確定我是否正確,但看起來像Python的結果是正確的。

問:

哪一個是正確的,以及如何實現用兩種語言正確的結果?

回答

7

問題是浮點值的有限精度:

>>> '%.18f' % 1.225 
'1.225000000000000089' 
>>> '%.18f' % 1.2225 
'1.222499999999999920' 
>>> '%.18f' % 1.22225 
'1.222250000000000059' 
>>> '%.18f' % 1.222225 
'1.222224999999999895' 

蟒十進制級是確切在這個意義上。

+1

爲了解決這個「R」中的「效應」問題,請嘗試使用Rmpfr(或者只是認識到它是浮點數的任何二進制表示形式都會發生什麼,並且與它一起生活): –

+0

嗨,Carl,我正在嘗試使用'Rmpfr',但無法計算如何達到預期的結果。查看我的問題的更新。 – art

+1

@art既然你已經接受了這個答案,而卡爾只是一個評論者而不是回答者,你應該問一個新問題,而不是修改你的問題,以便你接受的答案不再適合。 – Gregor