Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Python硬编码字符串与str()方法的差异_String_Python 3.x_Floating Point - Fatal编程技术网

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

String Python硬编码字符串与str()方法的差异,string,python-3.x,floating-point,String,Python 3.x,Floating Point,好的。这是我的最小工作示例。当我在python 3.6.2中键入此内容时: foo = '0.670' str(foo) 我明白了 但是当我打字的时候 foo = 0.670 str(foo) 我明白了 有什么好处?它是剥离零,我相信这与在计算机上表示浮点有关。但是通过使用str()方法,为什么在第一种情况下它可以保留额外的0?您正在混合字符串和浮点。字符串是一系列代码点(一个代码点代表一个字符),表示一些文本,解释器将其作为文本处理。字符串始终位于单引号或双引号内(例如,'Hello')。

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

foo = '0.670'
str(foo)
我明白了

但是当我打字的时候

foo = 0.670
str(foo)
我明白了


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

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

在第一种情况下,保存到
foo
字符串中。string上的
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.2
    0.20
    ,则
    0.10+0.1
    的结果会是什么
  • 为了科学的目的和重要的数字,它不应该让用户定义它的值吗

    如何定义输入编号并不重要。重要的是你想用什么格式来表达。正如我所说,
    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
    

    有关格式化数字和其他类型的更多信息,请查看。

    如果执行此操作会发生什么:
    foo='La面0.670 fusili'
    str(foo)
    ?一个字符串看起来像一个数字这一事实并不意味着它是一个。它仍然是一个字符串。事实上(在Python3中)该字符串是一个字符串序列。它在源代码中使用文本。@Qeek我想我不明白为什么Python会自动截断尾随的零。出于科学目的和重要数字的考虑,它是否应该保留用户定义的值?@Gleland我已经扩展了关于您的问题的答案。
    from struct import pack
    x = -1.53
    y = -1.53000
    print("X:", pack(">d", x).hex())
    print("Y:", pack(">d", y).hex())
    
    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