试图以浮点数结尾两个小数点,但保持为0.0

时间:2019-04-05 07:13:41

标签: python-3.x

我有一个浮点数,想限制为两位小数。

我尝试过format()和round(),但仍然只能得到0或0.0

x = 8.972990688205408e-05
print ("x: ", x)
print ("x using round():", round(x))
print ("x using format():"+"{:.2f}".format(x))

output:
x:  8.972990688205408e-05
x using round(): 0
x using format():0.00

我期望的是8.98或8.97,具体取决于所使用的方法。我想念什么?

4 个答案:

答案 0 :(得分:2)

您正在使用科学计数法。正如glhr在评论中指出的那样,您正在尝试舍入8.972990688205408e-05 = 0.00008972990688205408。这意味着尝试舍入为float类型将仅在小数点后打印前两个0,结果为0.00。您将必须通过0:.2e进行格式化:

x = 8.972990688205408e-05
print("{0:.2e}".format(x))

此打印:

8.97e-05

您在评论之一中询问如何仅获得8.97。 这是这样做的方法:

y = x*1e+05
print("{0:.2f}".format(y))

输出:

8.97

答案 1 :(得分:1)

如果我理解正确,您只想舍入尾数/有效位数?如果要将x保留为float并输出float,只需在调用round时指定精度:

x = round(8.972990688205408e-05,7)

输出:

8.97e-05 

但是,我建议首先将xdecimal module进行转换,这“为快速正确舍入的十进制浮点算术提供支持”(请参见this answer):

from decimal import Decimal
x = Decimal('8.972990688205408e-05').quantize(Decimal('1e-7')) # output: 0.0000897
print('%.2E' % x)

输出:

8.97E-05

或者使用format方法的缩写形式,该方法给出相同的输出:

print(f"{x:.2E}")

答案 2 :(得分:1)

在python(和许多其他编程语言)中,任何带数字后缀e的数字都是10的幂。

例如

8.9729e05 = 8.9729 x 10^3 = 8972.9
8.9729e-05 = 8.9729 x 10^-3 = 0.000089729
8.9729e0 = 8.9729 x 10^0 = 8.9729
8.972990688205408e-05 8.972990688205408 x 10^-5 = 0.00008972990688205408
8.9729e  # invalid syntax

正如其他答案所指出的那样,如果要打印出指数舍入,则需要使用正确的Python string format,您有很多选择。即

e   Floating point exponential format (lowercase, precision default to 6 digit) 
e   Floating point exponential format (uppercase, precision default to 6 digit).
g   Same as "e" if exponent is greater than -4 or less than precision, "f" otherwise
G   Same as "E" if exponent is greater than -4 or less than precision, "F" otherwise

例如

x = 8.972990688205408e-05
print('{:e}'.format(x))   # 8.972991e-05
print('{:E}'.format(x))   # 8.972991E-05
print('{:.2e}'.format(x))   # 8.97e-05

(更新)

OP提出了一种删除指数“ E”的方法。因为str.format()或“%”表示法只是输出一个字符串对象,所以打破字符串中的“ e”表示法就可以了。

'{:.2e}'.format(x).split("e")  # ['8.97', '-05']
print('{:.2e}'.format(x).split('e')[0])  # 8.97

答案 3 :(得分:0)

rount() returns closest multiple of 10 to the power minus ndigits, 

因此您不可能获得8.98或8.97。您也可以检查here