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

时间:2017-07-27 05:56:33

标签: string python-3.x floating-point

好。这是我最小的工作示例。当我输入python 3.6.2:

foo = '0.670'
str(foo)

我得到了

>>>'0.670'

但是当我输入

foo = 0.670
str(foo)

我得到了

>>>'0.67'

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

1 个答案:

答案 0 :(得分:3)

你正在混合字符串和浮点数。字符串是代码点的序列(一个代码点代表一个字符),代表一些文本,解释器将其作为文本处理。该字符串始终位于单引号或双引号内(例如'Hello')。 float是一个数字,Python知道它,因此它也知道1.00001.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)将其转换为字节。在这种情况下,它采用浮点数并给出如何在内存中保存。如果您运行代码,您将看到xy以相同的方式保存在内存中。内存不包含有关已保存号码格式的信息。

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

  1. 需要另外一个记忆,最好使用尽可能多的内存,不要浪费它。
  2. 0.10 + 0.10.2 0.20的结果是什么?
  3.   

    出于科学目的,有意义的数字不应该留下用户定义的价值吗?

    如何定义输入数字无关紧要。重要的是您想要用于呈现的格式。正如我所说,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