正如我所知,十进制是以处理能力为代价更精确的。 我发现了
("2016","04","03")
还计算点之前的数字。在我的情况下,我需要它只计算点之后的两个数字,无论数字有多大。因为有时我会得到像12345.15这样的数字,有时会得到像2.53这样的数字。如果数字是5或298.1怎么办?
我对浮点数,小数,舍入和截断之间的所有这些差异感到困惑。
我的主要问题是:
如何用最少的资源成本计算254.12或15.35之类的数字?也许甚至有可能伪造这些数字?舍入并不重要,但在点后计算浮点数和8位数然后截断它们似乎浪费了我的资源。如果我错了,请纠正我。
我也知道如何使用
进行基准测试getcontext().prec = 2
Decimal(number)
但我确定有足够的东西我不知道。由于我对编程很陌生,如果有人能给我一些代码来提供工作和学习的提示,我将非常高兴。感谢您抽出宝贵时间阅读本文! :)
答案 0 :(得分:3)
首先,请注意浮点运算并不一定像您担心的那样昂贵。这取决于您使用的CPU,但是,例如,由于流水线操作,主要整数程序中的单个浮点运算将花费与整数运算一样多的成本。这就像去夜总会的浴室。女孩们的浴室总是有一条线 - 整数操作 - 但从来没有一线为这些人 - 浮点运算。
另一方面,低功耗CPU甚至可能根本不包括浮点支持,使任何浮动操作都非常昂贵!因此,在您完全了解是否应该使用浮点运算或整数运算之前,请进行一些分析。您提到使用time.clock
并将开始时间与结束时间进行比较。您应该查看python附带的timeit
模块。
如果您知道您的应用程序需要超过小数的两位数,我建议您编写一个类来使用整数来实现该行为。 Python的整数在变大时会自动转换为大数字,精确度也很准确。因此存在性能损失(bignum操作比整数或浮动操作慢于顶端硬件)。但是你可以保证你想要的任何行为。
如果您的申请是财务申请,请注意您将不得不花一些时间处理rounding问题。每个人都看到超人3,现在他们认为你正在偷他们的.00001美分......
答案 1 :(得分:2)
在Python中,所有浮动都具有相同的大小,无论精度如何,因为它们都以单个“双”类型表示。这意味着无论哪种方式,你都会'浪费'内存(24字节实际上是微小数量)。使用sys.getsizeof
会显示:
>>> import sys
>>> sys.getsizeof(8.13333333)
24
>>> sys.getsizeof(8.13)
24
这也表明,如果int太大(整数没有最大值),它就无法转换成浮点数 - 你得到OverflowError
:
>>> 2**1024 + 0.5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: long int too large to convert to float
使用Decimal
的效率甚至更低,即使精确设置正确也是如此。这是因为类实例占用了大量空间,无论其内容如何:
>>> import decimal
>>> sys.getsizeof(decimal.Decimal(0))
80
答案 2 :(得分:1)
prec
设置实际上会影响总位数,而不仅仅是小数点后的位数。关于这一点,documentation说
新十进制的重要性仅由数字决定 数字输入。上下文精度和舍入仅起作用 在算术运算期间。
以及
quantize()方法将数字四舍五入为固定指数。这种方法 对于通常将结果舍入到a的货币应用程序非常有用 固定数量的地方
因此,如果您需要在该点之后使用固定数量的数字,这些是您可以查找的一些内容。
关于效果,在我看来,您过早优化。您通常无需担心最快方式进行不到一微秒的计算(当然,除非您需要按照每个数百万次此类计算的顺序执行某些操作第二)。在快速基准测试中,float
s的两个数字之和需要48纳秒,Decimal
s需要82纳秒。对于大多数应用来说,这种差异的影响应该很小。