HOWTO · Python
在 Python 中转换字符串为双精度数
本教程演示了如何在 Python 中把字符串类型转换为双精度的数值变量。
本页内容
Python 没有单独内置的 double 类型。其内置的 float 是二进制浮点类型,通常用于满足其他语言或 API 对 double 的要求。对于许多十进制小数,float 存储的是近似值,因此将字符串转换为数值并不能保留任意十进制精度。对于货币计算等需要可预测地表示十进制位数的场景,请使用 Decimal。
Python 中的“double”是什么意思
在许多语言中,“double”指双精度二进制浮点数。Python 的 float 通常承担这一角色,但类型名称和具体细节因语言而异。转换会改变数值的表示方式,却不会让每个十进制小数都变得精确。例如,十进制数 0.1 无法用有限位二进制数精确表示。
使用 float() 转换数值字符串
将包含数字的字符串传给内置的 float() 函数。下面的示例会打印常见的浮点结果,以及根据同一段文本创建的 Decimal:
运行此示例:
本节中的代码以及显示的标签或输出仍为英文。
from decimal import Decimal
numeric_text = "1974.6323"
number = float(numeric_text)
decimal_number = Decimal(numeric_text)
print(number)
print(decimal_number)
1974.6323
1974.6323
对于常规数值解析、科学计算,以及需要 Python 浮点数的 API,直接调用 float() 即可。显示出来的十进制形式便于阅读,但不会呈现内部二进制值的所有细节。运算可能会显露这些表示差异,因此对于许多计算所得的浮点数,不要依赖精确相等比较;在近似结果适用时,应使用容差进行比较。
需要十进制精度时使用 Decimal
Decimal 是 Python 标准库 decimal 模块中的一个类,并不是 float 的另一种写法,也不是 double 类型。与上例一样,应从原始字符串构造它,这样可以保留用户提供的十进制数字。如果改用浮点数构造,则会带入该浮点数已有的二进制近似值。
Decimal 运算遵循可配置精度上下文,因此它既不提供无限精度,也不能保证每次计算都精确。在价格等需要关注十进制表示和舍入规则的场景中,它很有用。请根据应用选择精度和舍入策略,并让操作数保持在同一数值类型体系中:Python 通常不允许直接混合 Decimal 和 float 进行运算。
处理无效输入并选择合适的类型
如果文本不是有效数字,float() 会引发 ValueError;而在默认上下文中,Decimal() 会产生 decimal.InvalidOperation。应在输入边界捕获相应异常,并提供有用的提示或请用户更正输入;不要悄悄把无效数据转换成看似合理的数字。例如:
本节中的代码以及显示的标签或输出仍为英文。
from decimal import Decimal, InvalidOperation
numeric_text = "12.50x"
try:
amount = Decimal(numeric_text)
except (InvalidOperation, ValueError):
amount = None
print("Enter a valid decimal amount.")
对于 Python 中通常对应 double 的类型,以及适合使用二进制浮点数的计算,请使用 float()。如果十进制位数和明确的舍入策略很重要,请使用 Decimal。两者都要求输入文本符合各自解析器接受的数值格式;例如,本地化数值 "1,25" 不会自动被解释为 1.25,因此转换前应依据应用的区域设置规则规范化输入。