diff --git a/frappe/public/js/frappe/misc/number_format.js b/frappe/public/js/frappe/misc/number_format.js index fa066475ca..e18784985f 100644 --- a/frappe/public/js/frappe/misc/number_format.js +++ b/frappe/public/js/frappe/misc/number_format.js @@ -218,7 +218,12 @@ function in_list(list, item) { function remainder(numerator, denominator, precision) { precision = cint(precision); var multiplier = Math.pow(10, precision); - var _remainder = ((numerator * multiplier) % (denominator * multiplier)) / multiplier; + if (precision) { + var _remainder = ((numerator * multiplier) % (denominator * multiplier)) / multiplier; + } else { + var _remainder = numerator % denominator; + } + return flt(_remainder, precision); }; @@ -226,10 +231,15 @@ function round_based_on_smallest_currency_fraction(value, currency, precision) { var smallest_currency_fraction_value = flt(frappe.model.get_value(":Currency", currency, "smallest_currency_fraction_value")) - var remainder_val = remainder(value, smallest_currency_fraction_value, precision); - if(remainder_val > (smallest_currency_fraction_value / 2)) { - return value + (smallest_currency_fraction_value - remainder_val); + if(smallest_currency_fraction_value) { + var remainder_val = remainder(value, smallest_currency_fraction_value, precision); + if(remainder_val > (smallest_currency_fraction_value / 2)) { + value += (smallest_currency_fraction_value - remainder_val); + } else { + value -= remainder_val; + } } else { - return value - remainder_val; + value = Math.round(value); } + return value; }; \ No newline at end of file diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 6c3cd35089..38b06301a6 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -276,21 +276,31 @@ def rounded(num, precision=0): return (num / multiplier) if precision else num -def remainder(numerator, denominator, precision): +def remainder(numerator, denominator, precision=2): precision = cint(precision) multiplier = 10 ** precision - _remainder = ((numerator * multiplier) % (denominator * multiplier)) / multiplier; + + if precision: + _remainder = ((numerator * multiplier) % (denominator * multiplier)) / multiplier + else: + _remainder = numerator % denominator + return flt(_remainder, precision); -def round_based_on_smallest_currency_fraction(value, currency, precision): +def round_based_on_smallest_currency_fraction(value, currency, precision=2): smallest_currency_fraction_value = flt(frappe.db.get_value("Currency", currency, "smallest_currency_fraction_value")) - remainder_val = remainder(value, smallest_currency_fraction_value, precision) - if remainder_val > (smallest_currency_fraction_value / 2): - return value + (smallest_currency_fraction_value - remainder_val) + if smallest_currency_fraction_value: + remainder_val = remainder(value, smallest_currency_fraction_value, precision) + if remainder_val > (smallest_currency_fraction_value / 2): + value += smallest_currency_fraction_value - remainder_val + else: + value -= remainder_val else: - return value - remainder_val + value = rounded(value) + + return flt(value, precision) def encode(obj, encoding="utf-8"): if isinstance(obj, list):