首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python:四舍五入/格式化浮点数/字符串到特定的小数/分数

python:四舍五入/格式化浮点数/字符串到特定的小数/分数
EN

Stack Overflow用户
提问于 2018-06-06 22:25:58
回答 2查看 993关注 0票数 0

我找到了很多关于python中四舍五入的帖子,但据我所知,到目前为止还没有解决我的问题。

我正在寻找两个解决方案:

示例:

  • + 500.5 :0小数(整数)(例如,最近:500.5 -> 501;向下: 500.99 -> 500;向上: 500.01 -> 501)
  • +100: 1小数(分数: 0.2) (例如,最近: 100.29 -> 100.2;向下: 100.39 -> 100.2;向上: 100.21 -> 100.4)。因此,该值必须以.0、.2、.4、.6或.8
  • +5: 2小数(分数: 0.01)结尾(例如,.0: 5.019 -> 5.02;向下: 5.019 -> 5.01;向上: 5.011 -> 5.02)。因此,该值必须以.x0、.x1、.x2、.x3、.x4、.x5、.x6、.x7、.x8或.x9

结尾

结果变量应该是一个字符串。

我想要的是一个可以传递小数和小数的函数

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-06 23:19:29

您可以为高度可定制的rounding使用Decimal module

代码语言:javascript
复制
import decimal 

def rnd(f,n,r=decimal.ROUND_HALF_DOWN):
    pat='1.'+'0'*n
    return str(decimal.Decimal(str(f)).quantize(decimal.Decimal(pat),r))

现在来测试一下:

代码语言:javascript
复制
for n in (500.99,100.39,5.019):
    for i in (0,1,2):
        print('n={:10}, i={:2}, Down: {:>10}, Closest: {:>10}'.format(n,i, rnd(n,i,decimal.ROUND_FLOOR),rnd(n,i)))   

打印:

代码语言:javascript
复制
n=    500.99, i= 0, Down:        500, Closest:        501
n=    500.99, i= 1, Down:      500.9, Closest:      501.0
n=    500.99, i= 2, Down:     500.99, Closest:     500.99
n=    100.39, i= 0, Down:        100, Closest:        100
n=    100.39, i= 1, Down:      100.3, Closest:      100.4
n=    100.39, i= 2, Down:     100.39, Closest:     100.39
n=     5.019, i= 0, Down:          5, Closest:          5
n=     5.019, i= 1, Down:        5.0, Closest:        5.0
n=     5.019, i= 2, Down:       5.01, Closest:       5.02

(注:这是1个十进制数的情况下的不同输出和100.39的输入。请说明在这种情况下100.2的期望输出是什么?输出不应该是100.3吗?)

有了这些说明,我认为您只需要使用fmod

代码语言:javascript
复制
import math 

def rnd(n,f,prec,direction='down'):
    if direction=='down':
        if prec==0:
            return str(int(n))
        return str(round(n-math.fmod(n,f),prec))
    else:
        if prec==0:
            return str(int(round(n)))
        n+=f
        return str(round(n-math.fmod(n,f),prec))

适用于所有给定的示例:

代码语言:javascript
复制
>>> rnd(500.99,0.1,0)
'500'
>>> rnd(500.99,0.1,0,'')
'501'
>>> rnd(100.39,0.2,1,'')
'100.4'
>>> rnd(100.39,0.2,1)
'100.2'
>>> rnd(100.59,0.2,1,'')
'100.6'
>>> rnd(100.59,0.2,1)
'100.4'
>>> rnd(5.019,0.01,2)
'5.01'
>>> rnd(5.019,0.01,2,'')
'5.02'

(使用'down'以外的任何字符串值调用带有direction=关键字参数的函数即可启动。根据您的喜好更改...)

编辑2

这将返回最接近输入数字的方法:

代码语言:javascript
复制
def rnd(n,f,prec):
    n1=int(n) if prec==0 else round(n-math.fmod(n,f),prec)
    n2=float(int(round(n))) if prec==0 else round((n+f)-math.fmod((n+f),f),prec)
    return str(min((n1,n2), key=lambda e: math.fabs(e-n)))
票数 1
EN

Stack Overflow用户

发布于 2018-06-06 22:39:56

像这样怎么样?

代码语言:javascript
复制
def round_accordingly(num):

    if num>=500:
        return str(round(num))
    elif num>=100:
        return str(round(num, 1))
    elif num>=5:
        return str(round(num, 2))


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

https://stackoverflow.com/questions/50722883

复制
相关文章

相似问题

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