Python错误地将字符串浮动

时间:2010-03-21 01:45:57

标签: python string floating-point python-3.x

我收到了

TypeError: Can't convert 'float' object to str implicitly

使用

Gambler.pot += round(self.bet + self.money * 0.1)
锅,赌注和金钱都是双打(或至少应该是)。我不确定这是否是另一个Eclipse的东西,但我如何让这行编译?

初始化betmoney的代码:

class Gambler:
    money = 0
    bet = 0

测试用例:

number = 0
print("Here, the number is a {0}".format(type(number)))
number = input("Enter in something: ")
print("But now, it has turned into a {0}".format(type(number)))

测试用例的输出:

Here, the number is a <class 'int'>
Enter in something: 1
But now, it has turned into a <class 'str'>

显然,input()正在将其更改为字符串。

编辑:最后用

修复了问题(我认为)
self.bet = int(self.bet.strip())

用户输入值后。虽然我不知道如果这是解决问题的最佳方法:)

Daniel G的更好解决方案:

self.bet = float(input("How much would you like to bet? $"))

6 个答案:

答案 0 :(得分:6)

3.x中的

input()仅返回字符串。程序员的工作是将它传递给数字构造函数,以便将其转换为数字。

答案 1 :(得分:4)

你在初始化锅吗?你是否尝试过存储中间结果来追踪问题来自哪里?最后,你知道pdb吗?这可能是一个很大的帮助。

class Gambler:
    pot = 0.0
    def __init__(self, money=0.0)
        self.pot = 0.0
        self.bet = 0.0
        self.money = money

    def update_pot(self):
        import pdb; pdb.set_trace()
        to_pot = self.bet + self.money * 0.1
        to_pot = round(to_pot)
        Gambler.pot = Gambler.pot + to_pot

执行set_trace()行时会出现提示。到达那里时,请尝试查看当前值。

(Pdb) h    # help
(Pdb) n    # go to next statement
(Pdb) l    # list source code
...
(Pdb) to_pot
...
(Pdb) self.bet
...
(Pdb) self.money
...
(Pdb) Gambler.pot
...
(Pdb) c    # continue

答案 2 :(得分:3)

如果Gambler.potself.betself.money中的任何一个以某种方式成为字符串(因为它们在某个时刻被设置为字符串),+将被视为字符串连接,它会导致您看到的错误消息。

答案 3 :(得分:3)

Python3.2 (py3k:77602)给出了以下错误消息:

>>> "1.2" * 0.1                                                #1
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can't multiply sequence by non-int of type 'float'
>>> "3.4" + 1.2 * 0.1                                          #2
Traceback (most recent call last):
  File "", line 1, in 
TypeError: Can't convert 'float' object to str implicitly
>>> n = "42"
>>> n += round(3.4 + 1.2 * 0.1)                                #3
Traceback (most recent call last):
  File "", line 1, in 
TypeError: Can't convert 'int' object to str implicitly

我怀疑您的错误消息是因为您的某个实际值是字符串而不是类似于#2的情景中的预期浮点数,这与您的例外完全匹配。

如果你能写一个test case,那将是一个很大的帮助。


请记住,Py3.x的输入与Py2.x的 raw _input 和Py2.x的输入相同>已经消失(相当于使用 evai ,你不想这样做)。因此,3.x中的 input 将始终返回一个字符串。使用 int 转换:

n = int(input("Enter a number: "))

如果你想处理输入错误,那就赶上ValueError,这是 int 引发错误的原因:

try:
  n = int(input("Enter a number: "))
except ValueError:
  print("invalid input")
else:
  print("squared:", n*n)

答案 4 :(得分:2)

在Python 3.x中,input()取代了Python 2.x的raw_input()。因此,函数input()返回用户输入的确切字符串(如raw_input()在先前版本中所做的那样)。

要获得Python 2.x行为,您可以执行

number = eval(input("Please enter a number: "))

但是,我不建议使用“eval”,因为用户可以在那里放置他们想要的任何Python行,这可能不是你想要的。如果你知道你想要float,那就告诉Python你想要的是什么:

number = float(input("Please enter a number: "))

答案 5 :(得分:0)

正如在评论中所说,你所展示的是将局部变量初始化为0.而是尝试类似:

class Gambler:
    def __init__(self):
        self.bet = 0.0
        self.money = 0.0

    def calc_pot(self):
        self.pot = round(self.bet  + self.money * 0.1)

g = Gambler()
g.bet = 2.0
g.money = 5.0
g.calc_pot()

print "Pot = %f" % (g.pot)

另外,确保没有任何东西可以将这些成员变成字符串。