好的。这是我的最小工作示例。当我在 python 3.6.2 中输入以下内容时:
foo = '0.670'
str(foo)
我明白了
>>>'0.670'
但是当我打字时
foo = 0.670
str(foo)
我明白了
>>>'0.67'
什么给了?它去掉了零,我认为这与一般计算机上表示 float 有关。但是使用str()
方法,为什么在第一种情况下可以保留多余的0
呢?
最佳答案
您正在混合字符串和 float 。字符串是表示某些文本的代码点序列(一个代码点代表一个字符),解释器将其作为文本处理。该字符串始终位于单引号或双引号内(例如 'Hello'
)。 float 是一个数字,Python 知道它,因此它也知道 1.0000
与 1.0
相同。
在第一种情况下,您将一个字符串保存到 foo
中。对字符串的 str()
调用只是获取字符串并按原样返回。
在第二种情况下,您将 0.670
保存为 float (因为它没有用引号引起来)。当 Python 将 float 转换为字符串时,它总是尝试创建尽可能短的字符串。
Why Python automatically truncates the trailing zero?
当您尝试将一些实数保存到计算机内存中时,您必须将其转换为二进制表示形式。通常(但也有一些异常(exception))它以标准 IEEE 754 中描述的格式保存,Python 也将其用于 float 。
让我们看一些例子:
from struct import pack
x = -1.53
y = -1.53000
print("X:", pack(">d", x).hex())
print("Y:", pack(">d", y).hex())
pack()
函数接受输入并根据给定格式 (>d
) 将其转换为字节。在这种情况下,它采用 float 并给出它在内存中的保存方式。如果运行代码,您将看到 x
和 y
以相同的方式保存在内存中。内存不包含有关已保存号码格式的信息。
当然,您可以添加一些有关它的信息,但是:
- 这将需要额外的内存,最好根据实际需要使用尽可能多的内存,不要浪费它。
- 如果
0.20
或0.20
,0.10 + 0.1
的结果会是什么?
For scientific purposes and significant figures shouldn't it leave the value as the user defined it?
如何定义输入数字并不重要。重要的是您想使用什么格式进行演示。正如我所说,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 .
关于string - Python 硬编码字符串与 str() 方法之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45342423/