如何限制输出的最大字符数? [复制]
Posted
技术标签:
【中文标题】如何限制输出的最大字符数? [复制]【英文标题】:How do I limit an output's maximum number of characters? [duplicate] 【发布时间】:2013-12-31 11:08:55 【问题描述】:我正在尝试将数字的输出限制为 4 个字符(包括小数)。
def costEdit(nCost):
nCost = '%.2f'%(nCost*1.25)
nCost = nCost * 1.25
return nCost
我希望将 nCost 截断到小数点后 2 位。例如。如果 nCost 是 8.364912734,则将其切断为 8.36 并编辑 nCost 变量以替换为该变量。有什么想法吗?
我得到了错误:
Traceback (most recent call last):
File "C:\Python33\My Codes\TextTowns\TextTowns.py", line 59, in <module>
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'
我将其用作:costEdit(nCost)
【问题讨论】:
术语挑剔:如果 nCost 等于8.364912734
,它不是整数。整数是整数。
我的错,谢谢:P
这是附注。如果你得到一个大于 9.99 的数字,你会遇到 5+ 个字符。限制为 2 个小数位还是只有 4 个字符更重要?你宁愿有1000
而不是1000.01
吗?
你希望这个函数返回一个四舍五入的字符串表示形式,还是一个实际的四舍五入数字?
这不是 python limiting floats to two decimal points 的副本。这个问题是关于 13.95
没有精确表示为 float
的事实,并且 Python 2.5 和更早的 repr
-d 以不直观的方式使用此类值。
【参考方案1】:
您遇到的问题是数字和数字的字符串表示之间的混淆。这些是不同的东西。
当你这样做时:
nCost = '%.2f'%(nCost*1.25)
...您将数字乘以 1.25,然后将其替换为一个字符串,该字符串表示最多两位小数的数字。所以,当你这样做时:
nCost = nCost * 1.25
...你试图将一个字符串乘以 1.25,这是没有意义的。
我怀疑你根本不想要一个字符串;您只是想将数字四舍五入作为数字。为此,请使用round
函数:
nCost = round(nCost*1.25, 2)
当然,只要你再次乘以 1.25,你就可以将它“取消四舍五入”一个或两个小数位:
>>> 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 位的上下文中进行数学运算,等等。
【讨论】:
非常感谢!完美运行,没有瑕疵! 赠送骑士帽【参考方案2】:一种方法是使用以下方法:
def costEdit(nCost):
nCost = '%.2f'%(nCost*1.25)
#nCost = nCost*1.25
return nCost
让我为你分解一下。
走线:
'%.2f'%(nCost*1.25)
并将其分解为组件:
(' ( (%) .2f) ')%(nCost*1.25)
''
中的所有内容都只是一个普通字符串。
%
是一个符号,意思是“稍后替换”。
.2f
是 Python 中的一个命令,用于截断小数点后 2 位。
%(nCost*1.25)
表示“nCost*1.25
是你用来代替 %
”的内容
因此,它按顺序进行nCost*1.25
的数学运算,将其放入字符串中,然后切断其他所有内容,并为您提供剩下的内容。
请注意,我已重写您的 costEdit
函数以接受 nCost
作为参数。这意味着现在您可以调用:
costEdit(nCost)
任何你想要的数字,它都会做数学运算。
另请注意,我已将 print
替换为 return
。这意味着现在,您必须编写:
print costEdit(80)
得到
100
但是现在这意味着您可以使用 costEdit
进行数学运算,例如:
print 4*costEdit(80)
而不是一路打印100
,它只会打印
400
问题?发表评论。
编码愉快!
编辑:关于你的错误,
我想我已经复制了它并理解了问题。
当我输入时:
costEdit('15')
我明白你的错误。
这是因为当您输入costEdit('15')
时,您输入的是'15'
而不是15
。如果一个值在''
或""
之间,那么您正在处理一个类型 string
的值。
在 python 中,您不能将float
(数字类型)与string
相乘。这就是抱怨的原因。
要纠正这种情况,只需删除引号即可。然后输入float
或int
(整数)类型的数字,这两者都可以乘以float
(1.25
内的值costEdit()
)。
我希望这能解决您的问题 - 我必须在晚上离开电脑。如果没有帮助,请发表评论,我明天会回来。
否则,我很高兴能提供帮助并记得为您的问题选择最佳答案,以便帮助的人获得他们的宝贵的宝贵积分sssss
【讨论】:
编辑您的原始问题——添加到最后。插入您当前使用的代码块来获取此错误,然后是此错误本身。如果我帮不了你,别人会的。 在这种情况下就好了。您可以返回并包括您输入的内容吗?如行中:costEdit(x)
?
@user3092506 尝试在我更新的帖子中解决您的问题。读一读。希望我能帮上忙!【参考方案3】:
Python 2.6 或更高版本,使用 format():
print('0:.3g'.format(nCost))
【讨论】:
'0:.2f'.format(nCost) 所以 2f 不是 2g 您能否也谈谈如何将这个值作为数字类型来获取?这将满足问题的“编辑要替换的 nCost 变量”部分。【参考方案4】:您可以为浮点数使用特殊格式代码
print('0:.2f'.format(nCost))
把2f改成4f增加位数
文档(http://docs.python.org/2/library/stdtypes.html#string-formatting)
【讨论】:
这似乎不起作用,有什么想法吗?现在编码:def costEdit(): global nCost nCost = nCost * 1.25 print('0:.2g'.format(nCost))
使用 2f 而不是 2g。那应该工作。所以“0:.2f”不是“0:.2g”
这与他现有代码中的%.2f'%
并没有什么不同。而且它并没有解决他的问题(试图将格式化的字符串乘以1.25,而不是乘以数字然后格式化)。以上是关于如何限制输出的最大字符数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何指定使用自动适应/填充创建的最大列数重复()? [复制]