From ee788042369f671f1e81d211f2d0a5cd314ead6c Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 6 Mar 2015 16:10:41 +0530 Subject: [PATCH] Fix in banker's rounding / nearest even rounding --- frappe/public/js/frappe/misc/number_format.js | 2 +- frappe/utils/data.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/misc/number_format.js b/frappe/public/js/frappe/misc/number_format.js index 86d61fd7b9..97241d5bb1 100644 --- a/frappe/public/js/frappe/misc/number_format.js +++ b/frappe/public/js/frappe/misc/number_format.js @@ -178,7 +178,7 @@ function _round(num, precision) { var m = Math.pow(10, d); var n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors var i = Math.floor(n), f = n - i; - var r = (f == 0.5) ? ((i % 2 == 0) ? i : i + 1) : Math.round(n); + var r = (!precision && f == 0.5) ? ((i % 2 == 0) ? i : i + 1) : Math.round(n); return d ? r / m : r; } diff --git a/frappe/utils/data.py b/frappe/utils/data.py index c7c880d57a..b667912f13 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -185,12 +185,14 @@ def flt(s, precision=None): """Convert to float (ignore commas)""" if isinstance(s, basestring): s = s.replace(',','') + try: num = float(s) if precision is not None: num = rounded(num, precision) except Exception: num = 0 + return num def cint(s): @@ -210,7 +212,7 @@ def cstr(s): return unicode(s) def rounded(num, precision=0): - """round method for round halfs to nearest even algorithm""" + """round method for round halfs to nearest even algorithm aka banker's rounding - compatible with python3""" precision = cint(precision) multiplier = 10 ** precision @@ -220,7 +222,7 @@ def rounded(num, precision=0): floor = math.floor(num) decimal_part = num - floor - if decimal_part == 0.5: + if not precision and decimal_part == 0.5: num = floor if (floor % 2 == 0) else floor + 1 else: num = round(num)