Python 硬编码字符串与 str() 方法的差异



好的。这是我的最小工作示例。当我在python 3.6.2中键入它时:

foo = '0.670'
str(foo)

我得到

>>>'0.670'

但是当我打字时

foo = 0.670
str(foo)

我得到

>>>'0.67'

什么给?它剥离了零,我认为这与在计算机上表示浮点数有关。但是通过使用str()方法,为什么它可以在第一种情况下保留额外的0

您正在混合字符串和浮点数。字符串是表示某些文本和解释器将其作为文本处理的代码点序列(一个代码点表示一个字符(。字符串始终位于单引号或双引号内(例如'Hello'(。浮点数是一个数字,Python 知道它,所以它也知道1.00001.0相同。

在第一种情况下,您保存到foo字符串中。对字符串的str()调用只是获取字符串并按原样返回。

在第二种情况下,您将0.670保存为浮点数(因为它没有用引号括起来(。当Python将浮点数转换为字符串时,它总是尝试创建尽可能短的字符串。

为什么 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(将其转换为字节。在这种情况下,它采用浮点数并给出它如何保存在内存中。如果运行代码,您将看到xy以相同的方式保存在内存中。内存不包含有关已保存号码格式的信息。

当然,您可以添加一些有关它的信息,但是:

这将需要另一个内存,最好
  1. 使用实际需要的内存,不要浪费它。
  2. 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 的文档。

最新更新