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

标签 string python-3.x floating-point

好的。这是我的最小工作示例。当我在 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.00001.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 并给出它在内存中的保存方式。如果运行代码,您将看到 xy 以相同的方式保存在内存中。内存不包含有关已保存号码格式的信息。

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

  1. 这将需要额外的内存,最好根据实际需要使用尽可能多的内存,不要浪费它。
  2. 如果 0.200.200.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/

相关文章:

javascript - Atom 无法为数组中的字符串元素着色

python-3.x - 有属性但没有方法的类

python - Python3中一串非英文字符的正确长度

c - 输入小数点后一位

MySQL Math —— INTEGER 和 FLOAT 哪个更快?

java - 为什么 String.equals 对于不相同(但相等)的 String 对象要慢得多?

javascript - 为什么我的 parseInt 函数没有将我的字符串转换为整数?

Python:比较两个字符串并返回它们共有的最长段

python - 如何将参数转换为 float

java - Java Float.compare() 总是产生正确的结果吗?