+ 1
Banker's rounding
Please tell me, are there any ways of classic rounding in Python 3?
10 Antworten
+ 1
Oh sorry, Aymane Boukrouh. My mistake. Alisa🌸🌸, there are no built-in functions to do what you're talking about, but you can create a custom function:
import math
def bankers_rounding(num):
if math.floor(num) % 2 == 0: #if rounding down num returns an even number
return math.floor(num)
else:
return math.ceil(num)
+ 2
Thank you, it was so easy
+ 2
Abhishek Sahoo, This is really useful and may come in handy, thank you :)
+ 1
You're welcome.
+ 1
Jianmin Chen 你好,can you please test your solution against test cases of 4.6 and 5.3?
+ 1
https://code.sololearn.com/ccPlRd5ZSdyj/?ref=app
Alisa🌸🌸 Please let me know if it's helpful
+ 1
Gordon , I'm pretty sure the program works correctly for those two numbers. 4.6 will return 4, and 5.3 will return 6.
By the way, 你好吗?我会说中文和英文。😃
+ 1
Jianmin Chen 我也會中文呀
banker's rounding 的話,4.6還是應該進位為5,5.3還是應該捨棄為5。只有.5時才要找最接近雙數,來平衡多次加減的誤差bias。
見:
https://en.m.wikipedia.org/wiki/Rounding
引用一:
Round half to even Edit
A tie-breaking rule without positive/negative bias and without bias toward/away from zero is round half to even. By this convention, if the fractional part of x is 0.5, then y is the even integer nearest to x. Thus, for example, +23.5 becomes +24, as does +24.5; while −23.5 becomes −24, as does −24.5. This function minimizes the expected error when summing over rounded figures, even when the inputs are mostly positive or mostly negative.
This variant of the round-to-nearest method is also called convergent rounding, statistician's rounding, Dutch rounding, Gaussian rounding, odd–even rounding,[6] or bankers' rounding.
解決的問題,見 Vancouver Stock Exchange那段。
+ 1
Jianmin Chen yes it is correct banker's rounding now~ 👏
甭客气~
0
Gordon, I see my error! Thanks for informing me, I wouldn't have known. So, Alisa🌸🌸, this means the correct code is:
import math
def bankers_rounding(num):
if (num - 0.5).is_integer() and (num + 0.5).is_integer(): #if number is exactly between two whole numbers
if math.floor(num) % 2 == 0: #if rounding down returns an even number
return math.floor(num)
else:
return math.ceil(num)
else:
return round(num) #if not exactly between two whole numbers, return the normally rounded amount
I believe that's my mistake, right? The number had to be exactly between two whole numbers in order to be rounded in the bankers' rounding method.
谢谢, Gordon.