好。这是我最小的工作示例。当我输入python 3.6.2:
foo = '0.670'
str(foo)
我得到了
>>>'0.670'
但是当我输入
时foo = 0.670
str(foo)
我得到了
>>>'0.67'
是什么给出的?它正在剥离零,我认为这与在计算机上代表浮点数有关。但是,通过使用str()
方法,为什么它可以在第一种情况下保留额外的0
?
答案 0 :(得分:3)
你正在混合字符串和浮点数。字符串是代码点的序列(一个代码点代表一个字符),代表一些文本,解释器将其作为文本处理。该字符串始终位于单引号或双引号内(例如'Hello'
)。 float是一个数字,Python知道它,因此它也知道1.0000
与1.0
相同。
在第一种情况下,您将foo
保存为字符串。 str()
对字符串的调用只取字符串并按原样返回。
在第二种情况下,您将0.670
保存为浮点数(因为它未包含在引号中)。当Python将float转换为字符串时,它总是尝试创建可能的最短字符串。
为什么Python会自动截断尾随零?
当您尝试将一些实数保存到计算机的内存中时,您必须将其转换为二进制表示形式。通常(但有一些例外)它以标准IEEE 754中描述的格式保存,而Python也将它用于浮点数。
我们来看一些例子:
from struct import pack
x = -1.53
y = -1.53000
print("X:", pack(">d", x).hex())
print("Y:", pack(">d", y).hex())
pack()
函数接受输入并基于给定格式(>d
)将其转换为字节。在这种情况下,它采用浮点数并给出如何在内存中保存。如果您运行代码,您将看到x
和y
以相同的方式保存在内存中。内存不包含有关已保存号码格式的信息。
当然,您可以添加一些有关它的信息,但是:
0.10 + 0.1
或0.2
0.20
的结果是什么?出于科学目的,有意义的数字不应该留下用户定义的价值吗?
如何定义输入数字无关紧要。重要的是您想要用于呈现的格式。正如我所说,str()
始终尝试创建最短的字符串。 str()
适用于一些简单的脚本或测试。出于科学目的(或需要某些表示的用途),您可以根据需要将数字转换为字符串。
例如:
x = -1655484.4584631
y = 42.0
# always print number with sign and exactly 5 numbers from fractional part
print("{:+.5f}".format(x)) # -1655484.45846
print("{:+.5f}".format(y)) # +42.00000
# always print number in scientific format (sign is showed only when the number is negative)
print("{:-2e}".format(x)) # -1.66e+06
print("{:-2e}".format(y)) # 4.20e+01
有关格式化数字和其他类型的详细信息,请查看Python's documentation。