使用十进制数 Python 进行字符串格式化

String Formatting with Decimal Number Python

提问人:Kyle 提问时间:11/2/2018 更新时间:11/2/2018 访问量:111

问:

我正在编写一份报告。报告中的一个数字需要以百万表示。我编写了一些基本的格式化程序来处理各种类型的格式,这些格式需要在整个报表中保持一致。为此,我使用 lambda 函数和字符串格式。这两个函数如下。一个是四舍五入,另一个是格式化。

formatter_round = lambda x: 0 if (x is None or x is bool) else round(x/1000000,1)

formatter_dollar = lambda x: '${:,.1}'.format(0) if (x is None or x == 0) else ('${:,.1}'.format(x) if x >= 0 else '$({:,.1})'.format(abs(x)))

现在问题来了。请看下面的例子。

我正在处理两个数字,并且.a = 350000b = 850000

因为一切都如我所期望的那样。四舍五入时浮点数不一定正确(不是“我所期望的”,而是可以理解的行为),但小数点是正确的。a

a = 350000

formatter_dollar(formatter_round(a))
Out[89]: '$0.3'

a = Decimal(a)

formatter_dollar(formatter_round(a))
Out[91]: '$0.4'

但是,当我使用 运行相同的示例时,这会崩溃。b

b = 850000

formatter_dollar(formatter_round(b))
Out[93]: '$0.8'

b = Decimal(b)

formatter_dollar(formatter_round(b))
Out[95]: '$0.8'

我的问题是,我怎样才能正确地舍入和显示数字?

我以为我的问题是浮点数,并且似乎证实了这一点。然后当我运行相同的 时,我意识到情况并非如此。ab

python-3.x 十进制 字符串格式化浮 点精度

评论

0赞 Mark Dickinson 11/3/2018
你说“崩溃”的例子。你这是什么意思?我看到的值是我期望看到的值。您期望什么价值观,为什么?b
0赞 Mark Dickinson 11/3/2018
您是否知道 Python 的默认舍入模式是舍入到偶数
0赞 Kyle 11/3/2018
我的意思是它没有像我预期的那样四舍五入。感谢您提供与整数相关的链接,这非常有帮助。我实际上是在寻找有关默认舍入行为的更多信息。现在我知道了正确的名称,我想做“四舍五入”四舍五入。是否可以在 python 中更改圆形类型?
0赞 Mark Dickinson 11/3/2018
不适用于浮点数,但舍入模式可针对类型进行配置;文档详细介绍了如何执行此操作。Decimal

答: 暂无答案