如何在python中显示两个小数点,当一个数字可以完全整除时?

How to display two decimal points in python, when a number is perfectly divisible?

目前我正在尝试解决一个问题,我应该将答案打印到小数点后两位 而不四舍五入。为此,我使用了以下代码

import math
a=1.175                            #value of a after some division
print(math.floor(a*100)/100)

我们得到的输出是:

1.17                              #Notice value which has two decimal points & not rounded

但当我尝试打印一个可整除的数字时,真正的问题开始了,小数点后只显示一个零。我使用了与上面相同的代码,但是现在

a=25/5                                   #Now a is perfectly divisible
print(math.floor(a*100)/100)

现在显示的输出是

5.0                                      #Notice only one decimal place is printed

纠正这个错误必须做什么?

您可以在官方Python教程中找到此推荐:15. Floating Point Arithmetic: Issues and Limitations

For more pleasant output, you may wish to use string formatting to produce a limited number of significant digits

print("%.2f" % 3.0)
3.00

format(3.0, ".2f")
'3.00'

除法有效,结果 returns 足够精确。

所以你的问题只是关于可视化或者完全是:

  • string-representation 个 floating-point 个

格式化小数

您可以使用 string-formatting。 例如在Python3中,使用f-strings:

twoFractionDigits = f"{result:.2f}"

print(f"{result:.2f}")

这个技巧 .2f,字符串 格式化文字 格式说明符 表示 floating-point 数字(f) 在 decimal-point (.2) 之后有两位小数。

另请参阅:

  • How to format a floating number to fixed width in Python

试试 Python-shell:

Python 3.6.9 (default, Dec  8 2021, 21:08:43) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> a=1.175                            #value of a after some division
>>> result = math.floor(a*100)/100
>>> result
1.17
>>> print(result)
1.17
>>> a=25/5                                   #Now a is perfectly divisible
>>> result = math.floor(a*100)/100
>>> result
5.0
>>> print(result)
5.0
>>> print(f"{result:.2f}")
5.00

将小数格式化为百分比

类似的你可以用百分比表示比率: print(f"{result:.2f} %")

打印:

5.00 %

格式化百分比的快捷方式可以是: print(f"{25/100:.2%}") 它将 25/100 == 0.25 的结果转换为:

25.00%

注:formatting-literal .2%自动从比率转换为百分比,在decimal-point后加上2位数字,并添加percent-symbol.

使用特定 scale 格式化小数(四舍五入或截断?)

现在没有rounding-off的部分,只是截断了。 例如,我们可以使用 repeating decimal,例如1/6 需要 roundedtruncated (cut-off) 在固定数量的小数位后 - scale(对比 precision)。

>>> print(f"{1/6:.2}")
0.17
>>> print(f"{1/6:.2%}")
16.67%

请注意格式化字符串如何不被截断(至 0.16)而是四舍五入(至 0.17)。这里 scale 在 formatting-literal 内被指定为 2 (在点之后)。

另请参阅:

  • Truncate to three decimals in Python
  • How do I interpret precision and scale of a number in a database?
  • What is the difference between precision and scale?

以固定宽度(前导空格)格式化许多小数

另一个例子是打印多个小数,比如在一列中作为right-aligned,这样你就可以很容易地比较它们。

然后使用string-formatting文字6.2f添加前导空格(这里是fixed-width of 6):

>>> print(f"{result:6.2f}")
  5.00
>>> print(f"{100/25*100:6.2f}")
400.00
>>> print(f"{25/100*100:6.2f}")
 25.00

另见

此处演示的所有 formatting-literal 也可以使用

应用
  • old-style %-formatting(也称为“Modulo string formatting”)继承自C语言的printf method。好处:这种方式也兼容Python before 3.6).
  • new-style .format 字符串方法(在 Python 3 中引入)

请参阅 ,其中展示了这些备选方案。

在 Python 中了解有关 string-formatting 的更多信息: