Python Decimal modf

4

如何高效地获取Python(Python 3)Decimal的整数部分和小数部分?

这是我目前拥有的代码:

from decimal import *
>>> divmod(Decimal('1.0000000000000003')*7,Decimal(1))
(Decimal('7'), Decimal('2.1E-15'))

欢迎提出任何建议。


听起来对我来说很合理。 - Ignacio Vazquez-Abrams
2个回答

2

您还可以使用math.modf文档

>>> math.modf(1.0000000000000003)
(2.220446049250313e-16, 1.0)
python2.7 -m timeit -s 'import math' 'math.modf(1.0000000000000003)'
1000000 loops, best of 3: 0.191 usec per loop
divmod方法:
python2.7 -m timeit -s 'import decimal' 'divmod(decimal.Decimal(1.0000000000000003),decimal.Decimal(1))'
1000 loops, best of 3: 39.8 usec per loop

我认为更有效的方法是使用 math.modf

编辑

我猜更简单和有效的方法就是将字符串转换为整数:

>>>a = int(Decimal('1.0000000000000003'))
1

>>>python2.7 -m timeit -s 'import decimal' 'int(decimal.Decimal('1.0000000000000003'))'
10000 loops, best of 3: 11.2 usec per loop

获取小数部分:
>>>int(Decimal('1.0000000000000003')) - a
3E-16

1
当然是这样的。任何操作float的东西都比操作decimal.Decimal的东西更快。然而,问题是关于decimal.Decimal,而不是float - Ignacio Vazquez-Abrams
@IgnacioVazquez-Abrams 用户真的在意他使用哪一个吗?如果float更快,为什么不只是将字符串转换为float。除非转换更加昂贵。 - user1786283
1
准确性是一个问题,这就是为什么我使用 Decimal 而不是 float 的原因。 - simonzack

2
  • 整数部分
123.456 // 1
# 123.0
  • 小数部分
123.456 % 1
# 0.45600000000000307
  • 精确的小数部分
p = 3 # precision as 3
123.456 % 1 * (10**p // 1 / 10**p)
# 0.456
  • 自动检测精度
def modf(f):
    sf = str(f)
    i = sf.find(".")
    p  = len(sf)-i-1
    inter = f // 1
    fractional = f % 1 * 10**p // 1 / 10**p
    return inter,fractional
modf(123.456)
# (123, 0.456)

modf()math.modf() 慢了20微秒(1/1000000 秒)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接