Goo*_*ose 4 python floating-point list
我有一个列表,它包含一个特定的数字'5.74536541',我转换为浮点数.
我正在使用Python 3打印它,("%0.2f" % (variable))但它总是打印出5.75而不是5.74.
我知道你在考虑谁在乎,但这是货币转换器计划,我不希望货币向上/向下舍入,但确切地说.
如何保持它不被舍入而且还保持2位小数?
由于您提到的舍入错误,您不应该使用浮点数作为货币.
您最好的选择是使用固定精度decimal,您还可以完全控制舍入和截断的工作方式.来自文档:
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
capitals=1, flags=[], traps=[Overflow, DivisionByZero,
InvalidOperation])
>>> getcontext().prec = 6
>>> Decimal('3.0')
Decimal('3.0')
>>> Decimal('3.1415926535')
Decimal('3.1415926535')
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
>>> getcontext().rounding = ROUND_UP
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')
Run Code Online (Sandbox Code Playgroud)
您应该在内部表示所有基于货币的值,Decimals并且具有高精度(在您的情况下,标准精度水平应该没问题 - 只需prec单独留下!).如果要为用户打印格式良好的美元和美分值,使用该locale模块是一种直接的方法.
打印时要小心,因为您必须将其Decimal向下量化到正确数量的显示位置,否则舍入将不会基于您的Decimal上下文!您应该只执行quantize最终显示的步骤或单个最终值 - 所有中间步骤都应使用高精度Decimals来使任何操作尽可能准确.
>>> from decimal import *
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'en_AU.UTF-8'
>>> getcontext().rounding = ROUND_DOWN
>>> TWOPLACES = Decimal(10) ** -2
>>> var = Decimal('5.74536541')
Decimal('5.74536541')
>>> var.quantize(TWOPLACES)
Decimal('5.74')
>>> locale.currency(var.quantize(TWOPLACES))
'$5.74'
Run Code Online (Sandbox Code Playgroud)