Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to round float 0.5 up to 1.0, while still rounding 0.45 to 0.0, as the usual school rounding?

Appears that the default Python round(1 / 2) gives 0.

How to round float 0.5 up to 1.0, while still rounding 0.45 to 0.0, as the usual school rounding?

NOTE: Sorry for deleting and posting this again, but it was incorrectly marked as duplicate of another question.

like image 844
EquipDev Avatar asked May 08 '17 15:05

EquipDev


People also ask

How do you round up a float?

Option 1: Python Round Function Python has an inbuilt function round(), which will take the float value and round it off. The round() function takes two parameters: Number and Ndigits (optional). Ndigits represent the number of decimal places to round.

How do you round up 0.5 in Python?

Round a float Up to the nearest 0.5 in Python # Call the math. ceil() method passing it the number multiplied by 2 . Divide the result by 2 . The result of the calculation is the number rounded up to the nearest 0.5 .

Does INT () round a float up or down?

You must first evaluate if the number is equal to its integer, which always rounds down. If the result is True, you return the number, if is not, return the integer(number) + 1.

Does Python use bankers rounding?

Python uses banker's rounding but not rounding away from zero because it's less biased.


1 Answers

It is actually currently considered proper to NOT blindly round *.5 up. Rather, it is proper to round *.5 to the nearest even number. Python 3 implements this "proper" form of "banker rounding", but a lot of other languages don't (yet). Blindly rounding *.5 up produces a slight bias, but "banker rounding" helps to balance it it out. See this thread for more info. So...

Method 1

You could conditionally use aceil(...) function (from the math module for the rounding up aspect. You'll have to do it conditionally in order to also maintain the regular rounding behavior for values less than 0.5. Try something like the following (note that this isn't extremely robust in that it only works on positive values...it should be able to be easily adapted to work with both positive and negative values though):

import math

val = 1.5
x = 0

if (float(val) % 1) >= 0.5:
    x = math.ceil(val)
else:
    x = round(val)

Note that a ceil(...) function will return an integer, not a float. This shouldn't be a major issue, but now you are aware.

Method 2

From the post I linked to above, it looks like another option is to use the decimal module to emulate the "old" way of rounding's behavior. I'm kind of copy & pasting from there, but here you go:

import decimal

x = decimal.Decimal('1.5').quantize(decimal.Decimal('1'), 
rounding=decimal.ROUND_HALF_UP)

Supposedly the decimal.ROUND_HALF_UP form of rounding is what you are looking for. This way you don't have to use a ceil(...) function conditionally.

I'm guessing that this was marked as a duplicate of another because a little digging would have given you more than enough info on this topic. (I didn't mark it as a duplicate, I'm just assuming that is why someone else did.)

like image 126
Luke Hollenback Avatar answered Oct 03 '22 22:10

Luke Hollenback