虽然在一个程序中处理美元数据以进行股票市场的自动交易(称为“算法交易”),但这些数字很难管理。在我看来,这并不重复,因为我没有在其他类似的问题/答案中找到合适的解决方案。
如果我单独运行 [更新,原来这是在家里的版本2.7.2] :
price_list = [1.0, 2.0, 2.5, 3.0, 4.0, 4.5, 4.6, 4.6, 4.7]
print price_list
...它打印出你在上面看到的方式。 然而,在我的千行计划中,Python似乎在说,你并不是真的这么说,你真正的意思是:
>nasdaq_crunching_4d.py
[1.0, 2.0, 2.5, 3.0, 4.0, 4.5, 4.5999999999999996, 4.5999999999999996, 4.7000000000000002]
[更新:它与我的程序中的两行vs没有任何关系。 额外的数字输出在我使用的远程主机上,Bluehost的版本是2.6.6。 我很惊讶任何人都使用2.6,看起来它与他们的CentOS一起,他们提供了每用户升级的说明,很好。 然而问题的其余部分仍然有效。 ]
...然后在你知道它之前,你试图把头包裹在庞大的名单上(小开胃菜,我认为太辣了):
'slopes': [-40.280000000000001, 79.689999999999998, -40.56000000000...
80.340000000000003, -40.420000000000002, 80.159999999999997, -40.28...
79.849999999999994, -40.090000000000003, 79.439999999999998, -39.96...
79.129999999999995, -40.350000000000001, 79.829999999999998, -40.39...
80.030000000000001, -40.729999999999997, 80.719999999999999, -40.93...
我想告诉Python,不,我的意思不是4.5999999999999996
,我的意思是4.60
,如果你需要的话,后面跟着十亿和一个零,
我只想要两个这样的数字,所以你可以忽略其余的零。
但是,如果 4.60
,请告诉我4.60
,而不是4.6
,绝对不是4.5999999999999996
这也不合适:
'lst': [Decimal('124.75'), Decimal('125.18'), Decimal('125.18...
'ma_b': {'max': 4, 'now': Decimal('125.36'), 'lth': 5, 'slp':...
Decimal('125.18'), Decimal('125.25'), Decimal('125.36')]}, 'm...
0.06], 'lst': [Decimal('125.19'), Decimal('125.17' '118.19'),...
您可能想知道我正在导入数学(从中使用各种函数),并且尝试过round(),float(),“%。2f”以及其他我忘记了现在。 有一个庞大而复杂的字典,包含各种列表的股票代码,价格,移动平均线,斜率和许多其他浮点数以及字符串和其他字符串等。
有没有什么方法可以让美元一直只是美元和美分?感谢。
答案 0 :(得分:3)
您继续打印列表,列表使用repr()
表示其内容。如果您想要更好地控制格式,那么您必须使用正确的格式:
print '[{}]'.format(', '.join([format(n, '.2f') for n in numbers_list]))
会将输出格式化为类似于列表的字符串,所有浮点数在小数点后打印2位数字:
>>> numbers_list = [1.0, 2.0, 2.5, 3.0, 4.0, 4.5, 4.5999999999999996, 4.5999999999999996, 4.7000000000000002]
>>> print '[{}]'.format(', '.join([format(n, '.2f') for n in numbers_list]))
[1.00, 2.00, 2.50, 3.00, 4.00, 4.50, 4.60, 4.60, 4.70]
也许浮点数不是美元和美分价值的最佳代表;只存储美分作为整数(4美元20美分变为420美分)。毕竟,对于大多数目的来说,分数是不可分的。
答案 1 :(得分:2)
您正在使用浮点运算并期望准确性。在任何语言中,这几乎都行不通。
使用整数表示一分钱的固定分数(而不是一分钱的4.60,460,000,000百万分之一。)
您将无法轻松实现准确性和可变数量的小数位
答案 2 :(得分:2)
如果您将其存储为小数:
annoying_list=[decimal.Decimal(3.42), decimal.Decimal(2.56)]
for i in annoying_list: print float(i)
返回:
3.42
2.56
答案 3 :(得分:1)
快速而肮脏的方法是在主模块的开头重新定义Decimal
:
from decimal import Decimal
Decimal.__repr__ = lambda self: "{0:.2f}".format(self)
这适用于所有小数,包括在外部模块中创建的任何小数。
另一种方法是创建自己的Decimal
子类,但是为了简单方便而定义新类型这样做是一个坏习惯,我认为:如果任何外部函数返回基类型的对象,那么你需要将它转换为你的类型的新对象,这是不必要的低效率。此外,Decimal
使用slots并且意味着是不可变类型,因此任何子类都需要考虑这一点以保持效率。
更好的方法是定义自己的功能,以便按照您想要的方式显示它。这样,您可以在重新格式化时将其限制为特别要使用它。但是,此函数需要重新实现递归列表输出算法。幸运的是,repr library大大简化了这一点。这允许您为每种类型定义自定义repr
实现,内置支持列表和词典等递归对象:
from decimal import Decimal
from repr import Repr
class CustomRepr(Repr):
def repr_Decimal(self, obj, level):
return "{0:.2f}".format(obj)
cr = CustomRepr()
data = {"money": [Decimal("42")]}
print cr.repr(data)
输出:
{'money': [42.00]}