如何在Python中将字符串转换为十进制数进行算术运算?

5

以下类似的帖子并不能回答我的问题。 将字符串转换为带有小数的整数

考虑以下Python代码。

>>> import decimal
>>> s = '23.456'
>>> d = decimal.Decimal(s)
>>> d
Decimal('23.456')           # How do I represent this as simply 23.456?
>>> d - 1
22                          # How do I obtain the output to be 22.456?

如何将字符串转换为十进制数,以便能够执行算术运算并获得正确精度的输出?


看起来像是之前的问题。使用float()函数即可。https://dev59.com/DXRB5IYBdhLWcg3w4bAo - Girish Rao
x = float(23.456) - 1 出了什么问题? - RanRag
对,浮点数不是十进制数。我认为浮点数不那么精确。 - idealistikz
这里概述了Decimalfloat之间的区别:http://docs.python.org/library/decimal.html - Levon
Decimal 在表示十进制(基数为10)数字时更加“精确”;而 float 在表示二进制(基数为2)数字时更加精确。 - Andrew Jaffe
7个回答

4

如果您想保留小数,最安全的方法是将所有内容进行转换:

>>> s = '23.456'
>>> d = decimal.Decimal(s)

>>> d - decimal.Decimal('1')
Decimal('22.456')
>>> d - decimal.Decimal('1.0')
Decimal('22.456')

在Python 2.7中,整数有隐式转换,但浮点数没有。
>>> d - 1
Decimal('22.456')
>>> d - 1.0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'Decimal' and 'float'

3

您的计算是否需要使用DecimalDecimal固定点和浮点数算术文档详细介绍了它们之间的区别。如果不需要,您可以直接进行以下操作:

 d = float('23.456')
 d
 23.456

 d - 1
 22.456

有趣的是,在使用 Decimal 时,我在交互模式下得到了以下结果

d = decimal.Decimal('23.456')

d
Decimal('23.456')
d - 1
Decimal('22.456')

但是当我打印它时,我得到了这些值。
print d
23.456
print d-1
22.456

1
浮点数并不相同:float('100000000.0') + float('0.000000001') 等于 100000000.0。 - wroniasty
1
当然有区别:float(1e15) + float('0.001') 等于 1e15。 - wroniasty
2
使用十进制而不是浮点数有很多原因。例如,对于财务算术来说真的没有使用浮点数的好理由,在某些场合,法律要求使浮点实现相对于十进制实现非常困难。 - Dietrich Epp
1
代码decimal.Decimal(float('23.456'))存在相当大的信息丢失。float调用没有添加任何内容,实际上它从字符串中删除了精度信息。您永远不应该使用Decimal(float(x)) - Dietrich Epp
2
>>> print d>>> d 的区别在于 strrepr 的不同。详情请参考 https://dev59.com/KHM_5IYBdhLWcg3wTRPL。 - Andrew Jaffe
显示剩余2条评论

1
你是特意想使用 Decimal 任意精度库还是只是在努力将字符串转换为 Python 浮点数?
如果你是想使用 Decimal:
>>> import decimal
>>> s1='23.456'
>>> s2='1.0'
>>> decimal.Decimal(s1) - decimal.Decimal(s2)
Decimal('22.456')
>>> s1='23.456'
>>> s2='1'
>>> decimal.Decimal(s1) - decimal.Decimal(s2)
Decimal('22.456')

或者,我认为更有可能的是,您正在尝试将字符串转换为Python浮点值:

>>> s1='23.456'
>>> s2='1'
>>> float(s1)-float(s2)
22.456
>>> float(s1)-1
22.456
>>> float(s1)-1.0
22.456

转换为浮点数很容易。 - Nathindu Himansha

0
如果使用浮点数,当数字变得太大时——例如x = 29345678.91——你会得到一些意想不到的结果。在这种情况下,float(x) 变成了2.934567891E7,这似乎是不可取的,特别是在处理财务数字时。

0
在Python中,将一个值字符串转换为浮点数非常简单:
num = "29.0"
print (float(num))

将字符串转换为十进制数

from decimal import Decimal
num = "29.0"
print (Decimal(num))

0

我认为float不够精确。如果需要更高的精度,这是否是一个有效的解决方案? - idealistikz
在Python中,浮点数等同于C语言的double类型。你需要多少精度? - Trevor
float('100000000.0') + float('0.000000001') 的结果为 100000000.0,所以我猜这不是一个有效的解决方案。 - wroniasty

0

我的Python似乎做得不同:

>>> s = '23.456'
>>> d = decimal.Decimal(s)
>>> d
Decimal('23.456')
>>> d-1
Decimal('22.456')

你使用的是哪个版本/操作系统?

我正在Windows 7上使用Python 2.7。 - idealistikz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接