首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不四舍五入的Python string.format()百分比

不四舍五入的Python string.format()百分比
EN

Stack Overflow用户
提问于 2013-07-12 16:30:01
回答 4查看 29.2K关注 0票数 27

在下面的示例中,我想将格式设置为1位小数,但python似乎喜欢将数字四舍五入,有没有方法使其不四舍五入?

代码语言:javascript
复制
>>> '{:.1%}'.format(0.9995)
'100.0%'
>>> '{:.2%}'.format(0.9995)
'99.95%'
EN

回答 4

Stack Overflow用户

发布于 2013-07-12 16:37:41

如下所示:

代码语言:javascript
复制
def my_format(num, x):
     return str(num*100)[:4 + (x-1)] + '%'

>>> my_format(.9995, 1)
'99.9%'
>>> my_format(.9995, 2)
'99.95%'
>>> my_format(.9999, 1)
'99.9%'
>>> my_format(0.99987, 2)
'99.98%'
票数 1
EN

Stack Overflow用户

发布于 2018-08-23 16:43:22

使用Python 3.6+,您可以使用格式化的字符串文字,也称为f字符串。这些方法比str.format更有效。此外,您可以使用更有效的楼层划分,而不是math.floor。在我看来,语法也更具可读性。

下面列出了这两种方法,以便进行比较。

代码语言:javascript
复制
from math import floor
from random import random

def floored_percentage(val, digits):
    val *= 10 ** (digits + 2)
    return '{1:.{0}f}%'.format(digits, floor(val) / 10 ** digits)

def floored_percentage_jpp(val, digits):
    val *= 10 ** (digits + 2)
    return f'{val // digits / 10 ** digits:.{digits}f}%'

values = [random() for _ in range(10000)]

%timeit [floored_percentage(x, 1) for x in values]      # 35.7 ms per loop
%timeit [floored_percentage_jpp(x, 1) for x in values]  # 28.1 ms per loop
票数 1
EN

Stack Overflow用户

发布于 2013-07-12 16:37:19

有几种方法,也许最简单的是

代码语言:javascript
复制
x = str(10. * 0.9995).split('.')
my_string = '%s.%s%%' % (x[0], x[1][:2])

这将确保您始终将小数点放在正确的位置(对于1.00000.001这样的边缘情况)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17610698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档