round up/down float to 2 decimals

一世执手 提交于 2021-02-04 06:28:46

问题


I would like to design a function f(x : float, up : bool) with these input/output:

# 2 decimals part rounded up (up = True)
f(142.452, True) = 142.46
f(142.449, True) = 142.45
# 2 decimals part rounded down (up = False)
f(142.452, False) = 142.45
f(142.449, False) = 142.44

Now, I know about Python's round built-in function but it will always round 142.449 up, which is not what I want.

Is there a way to do this in a nicer pythonic way than to do a bunch of float comparisons with epsilons (prone to errors)?


回答1:


Have you considered a mathematical approach using floor and ceil?

If you always want to round to 2 digits, then you could premultiply the number to be rounded by 100, then perform the rounding to the nearest integer and then divide again by 100.

from math import floor, ceil

def rounder(num, up=True):
    digits = 2
    mul = 10**digits
    if up:
        return ceil(num * mul)/mul
    else:
        return floor(num*mul)/mul



回答2:


You can also perform some mathematical logic if you do not want to use any explicit function as:

def f(num, up):
    num = num * 100
    if up and num != int(num):  # if up and "float' value != 'int' value
        num += 1
    return int(num) / (100.0)

Here, the idea is if up is True and int value of number is not equal to float value then increase the number by 1. Else it will be same as the original number




回答3:


math.ceil() rounds up, and math.floor() rounds down. So, the following is an example of how to use it:

import math

def f(x, b):
    if b:
        return (math.ceil(100*x) / 100)
    else:
        return (math.floor(100*x) / 100)

This function should do exactly what you want.



来源:https://stackoverflow.com/questions/40613590/round-up-down-float-to-2-decimals

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!