我一直在环顾四周尝试将浮点数或小数的长度设置为2个位置,我正在为一组课程工作做这个,我尝试了getcontext
但它什么也没做。
from decimal import *
getcontext().prec = 2
price = ("22.5")
#I would like this to be 22.50, but as it comes form a list and I use float a bit, so I have to convert it to decimal (?)
price = Decimal(price)
print (price)
但输出是:
22.5
如果有人知道更好的方法将小数点的长度设置为2位小数(使用金钱)或者我出错了,那将会有所帮助。
答案 0 :(得分:5)
“float”是“浮点”的缩写。阅读https://en.wikipedia.org/wiki/Floating-point_arithmetic上的浮点数,然后从不 永远 永远用它来代表金钱。
您与Decimal
走在正确的轨道上。您只需要注意表示的精度与显示之间的区别。
上下文的prec
属性控制由不同操作产生的值表示的精度。它不控制显式构造值的精度。它不能控制显示器的精度。
考虑:
>>> getcontext().prec = 2
>>> Decimal("1") / Decimal("3")
Decimal('0.33')
>>>
VS
>>> getcontext().prec = 2
>>> Decimal("1") / Decimal("2")
Decimal('0.5')
>>>
VS
>>> getcontext().prec = 2
>>> Decimal("0.12345")
Decimal('0.12345')
>>>
要指定Decimal的显示精度,您只需要对显示代码进行更多控制。不要依赖str(Decimal(...))
。
一个选项是规范化显示的小数:
>>> getcontext().prec = 2
>>> Decimal("0.12345").normalize()
Decimal('0.12')
这尊重上下文中的prec
设置。
另一种选择是将其量化为特定的精度:
>>> Decimal("0.12345").quantize(Decimal("1.00"))
Decimal('0.12')
这与上下文中的prec
设置无关。
小数也可以舍入:
>>> round(Decimal("123.4567"), 2)
123.46
虽然因为舍入的结果是 float 而要非常小心。
您也可以将Decimal直接格式化为字符串:
>>> "{:.2f}".format(Decimal("1.234"))
'1.23'
答案 1 :(得分:1)
试试这个:
print "{:.2f}".format(price)
这样就不需要全局设置精度。