本问题已经有最佳答案,请猛点这里访问。
我试图将一个数字的输出限制为4个字符(包括小数)。
1
2
3
4def costEdit(nCost):
nCost = '%.2f'%(nCost*1.25)
nCost = nCost * 1.25
return nCost
我要把NCOST的小数点后两位截断。例如,如果ncost为8.364912734,则将其切断为8.36,然后编辑要替换的ncost变量。有什么想法吗?
我得到错误:
1
2
3
4
5
6Traceback (most recent call last):
File"C:\Python33\My Codes\TextTowns\TextTowns.py", line 59, in
costEdit(nCost)
File"C:\Python33\My Codes\TextTowns\TextTowns.py", line 27, in costEdit
nCost = nCost*1.25
TypeError: can't multiply sequence by non-int of type 'float'
我用它作为:成本编辑(NCOST)
术语吹毛求疵:如果ncost等于8.364912734,它就不是整数。整数是整数。
我的错,谢谢:P
这是一张便条。如果你得到一个大于9.99的数字,你会遇到5个以上的字符。将小数位数限制在2位还是只有4个字符更重要?你愿意用1000而不是1000.01吗?
您希望此函数返回舍入数字的字符串表示形式还是实际的舍入数字?
四舍五入的数字:P
这不是Python的副本,它将浮点限制为两个小数点。这个问题是关于这样一个事实:13.95并没有精确地表示为float,而python 2.5和更早的repr以非直观的方式表示了这些值。
您遇到的问题是一个数字和一个数字的字符串表示形式之间的混淆。这些是不同的东西。
当你这样做的时候:
1nCost = '%.2f'%(nCost*1.25)
…您将数字乘以1.25,然后用一个字符串替换它,该字符串最多代表两个小数点。所以,当你这样做的时候:
1nCost = nCost * 1.25
…你想把一个字符串乘以1.25,这毫无意义。
我怀疑你根本不想要一个字符串,你只是想把这个数字四舍五入。为此,使用round功能:
1nCost = round(nCost*1.25, 2)
当然,一旦你再次乘以1.25,你就可以用另一个小数位"解开"它:
1
2
3
4
5
6
7>>> nCost = 1.33333
>>> nCost = round(nCost*1.25, 2)
>>> nCost
1.33
>>> nCost = nCost * 1.25
>>> nCost
1.6625
实际上,在对值进行算术运算之前对它们进行取整几乎总是一个坏主意;这只是不必要地增加了取整误差。在打印/写入磁盘等阶段,最好尽可能长地保持最高的精度值,并在最后一秒理想情况下使用%.2f/{:.2f}格式。
要记住的另一件事是,并非所有的实数都能精确地表示为浮点数。例如,round(13.4999, 2)实际上是13.949999999999999289457264。一个简单的repr或str或%f会把这个打印成13.95,所以你可能不会注意到……但它仍然不是13.95。
解决这个问题和其他问题的最佳方法是使用Decimal类型而不是float类型。然后可以将值精确舍入到小数点后2位,在小数点后2位的上下文中进行数学运算,等等。
非常感谢!工作完美,没有瑕疵!授予骑士身份
这样做的一种方法是:
1
2
3
4def costEdit(nCost):
nCost = '%.2f'%(nCost*1.25)
#nCost = nCost*1.25
return nCost
让我给你把这个分解一下。
采取行动:
1'%.2f'%(nCost*1.25)
并将其分解为各个组成部分:
1(' ( (%) .2f) ')%(nCost*1.25)
''中的所有内容都只是一个普通字符串。
%是一个符号,意思是"以后可以替代"。
.2f是python中的一个命令,在小数点后截断2位。
%(nCost*1.25)的意思是"nCost*1.25是你用来代替%的东西"
因此,它依次进行nCost*1.25的数学运算,将其放入字符串中,然后切断其他所有内容,并给出剩下的内容。
请注意,我已经重写了您的costEdit函数,以接受nCost作为参数。这意味着现在您可以拨打:
1costEdit(nCost)
任何你想要的数字,它都可以做数学运算。
还要注意,我已经用return替换了print。这意味着现在,你必须写:
1print costEdit(80)
得到
1100
但是现在它意味着你可以用costEdit来做数学,比如:
1print 4*costEdit(80)
而不是一路打印100,它只会打印
1400
问题?留下评论。
快乐编码!
编辑:关于您的错误,
我想我已经复制了它并理解了这个问题。
当我键入:
1costEdit('15')
我明白你的错误。
这是因为当你做costEdit('15')时,你进入'15',而不是15。如果值介于''或""之间,则处理的是string类型的值。
在python中,不能将EDOCX1(数字类型)与string相乘。这就是我们抱怨的。
要纠正这种情况,只需去掉引号。然后输入一个float或int类型的数字,这两个类型都可以乘以float(1.25在costEdit()中的值)。
我希望这能解决你的问题——我晚上得离开电脑。如果没有帮助,请留言,我明天就回来。
否则,我很高兴我能帮你,并记得在你的问题上选择一个最佳答案,这样那些帮助你的人就可以得到他们宝贵的价值。
编辑你原来的问题——添加到结尾。插入当前用于获取此错误的代码块,然后插入此错误本身。如果我帮不了你,别人会帮你的。
在这种情况下是可以的。你能回去把你输入的内容包括进去吗?如行:costEdit(x)?
@用户3092506试图在我更新的帖子中修复您的问题。读一下。希望我帮忙!
您可以对浮动使用特殊格式代码
1print('{0:.2f}'.format(nCost))
将2F改为4F以增加位数
文档(http://docs.python.org/2/library/stdtypes.html字符串格式)
这似乎不起作用,有什么想法吗?现在编码:def costEdit(): global nCost nCost = nCost * 1.25 print('{0:.2g}'.format(nCost))。
使用2F而不是2G。应该可以。所以"0:.2f"不是"0:.2g"
在现有代码中,这与%.2f'%没有任何不同。但这并不能解决他的问题(试图将格式化字符串乘以1.25,而不是先乘以数字再格式化它)。
python 2.6或更高版本,使用format():
1print('{0:.3g}'.format(nCost))
'0:.2f'。格式化(ncost),因此2f不是2g
你也能谈谈如何得到这个数值作为一个数字类型吗?这将满足问题的"编辑要替换的ncost变量"部分。