半数甚至十进制

art*_*art 3 python r rounding

默认情况下,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结果是正确的.

题:

哪一个是正确的,以及如何使用这两种语言实现正确的结果?

Dan*_*iel 7

问题是浮点值的有限精度:

>>> '%.18f' % 1.225
'1.225000000000000089'
>>> '%.18f' % 1.2225
'1.222499999999999920'
>>> '%.18f' % 1.22225
'1.222250000000000059'
>>> '%.18f' % 1.222225
'1.222224999999999895'
Run Code Online (Sandbox Code Playgroud)

Pythons Decimal-class在这个意义上是准确的.

  • @art既然你已经接受了这个答案,而卡尔只是一个评论者而不是答案者,你应该提出一个新问题而不是修改你的问题,这样你接受的答案就不再足够了。 (2认同)