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

python:将浮点/字符串四舍五入/格式化为特定的小数/分数,python,decimal,rounding,fractions,floor,Python,Decimal,Rounding,Fractions,Floor,我在python中找到了很多关于舍入的帖子,但据我所知,到目前为止没有一篇能够解决我的问题 我正在寻找两种解决方案: 四舍五入最接近:需要根据大小进行不同四舍五入的浮点数/字符串数 向下舍入:需要根据大小进行不同的向下舍入的浮点数/字符串数 四舍五入:浮点数/字符串数,需要根据其大小进行不同的四舍五入 例如: +500:0小数(整数)(例如,最接近的:500.5->501;向下:500.99->500;向上:500.01->501) +100:1小数(分数:0.2)(例如,最近值:100.

我在python中找到了很多关于舍入的帖子,但据我所知,到目前为止没有一篇能够解决我的问题

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

  • 四舍五入最接近:需要根据大小进行不同四舍五入的浮点数/字符串数

  • 向下舍入:需要根据大小进行不同的向下舍入的浮点数/字符串数

  • 四舍五入:浮点数/字符串数,需要根据其大小进行不同的四舍五入

例如:

  • +500: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)(例如,最近的:5.019->5.02;向下:5.019->5.01;向上:5.011->5.02)。因此,该值必须以.x0、.x1、.x2、.x3、.x4、.x5、.x6、.x7、.x8或.x9结尾
结果变量应为字符串


我正在寻找一个函数,在这个函数中我可以传递小数和分数的数量

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))
您可以使用进行高度自定义:

现在要测试:

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)))   
印刷品:

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

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))
适用于以下所有示例:

>>> 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'
(使用
direction=
关键字参数调用该函数,该参数使用除
'down'
以外的任何字符串值,以使函数能够启动。根据您的喜好进行更改…)


编辑2 这将返回最接近输入编号的方法:

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)))

请看一下模块。你需要的一切都在那里…为什么不写一个自定义函数呢?-它可以是一个简单的if else梯形图。您可以使用map来加快进程,或者如果使用panda,可以使用apply函数。我仍然不知道如何编写自定义函数。不幸的是,它不能解决我的问题。让我澄清一下:在+100中,“分数:0.2”意味着数字必须以0.0、0.2、0.4、0.6或0.8结尾。因此,100.51应该转换为100.6(最接近)或100.4(向下),不幸的是,它不能解决我的问题。让我澄清一下:在+100中,“分数:0.2”意味着数字必须以0.0、0.2、0.4、0.6或0.8结尾。因此,100.51应该转换为100.6(最接近)或100.4(向下),但您的帖子中有最接近:100.39->100.4。现在你是说应该是100.6?不,100.39->100.4表示最近;100.39->100.2表示向下。因此,对于“分数”为0.2的最近小数,数字应该四舍五入到最接近0.0、0.2、0.4、0.6和0.8的小数点。这太棒了!“只是”一件事:舍入是否有可能返回最接近的值(现在是硬向下还是硬向上)?你太棒了!对于非小数的值(+500),我仍然用新函数得到了一个小数,但是我用
if-isinstance(n1,int):return-str(int(min((n1,n2),key=lambda e:math.fabs(e-n))
完成了这个函数。我还合并了函数(参数方向='up','down'或最近的为空)。我非常感谢你抽出时间来做这件事,非常感谢!
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)))