[FIX] web: Python-like rounding method
Javascript and Python handle the rounding of -x.5 differently. In JS, `Math.round(-0.5)` is equal to `-0`. In Python, `round(-0.5)` is equal to `-1`. This will lead to inconsistencies between Python and Javascript, but it can also lead to inconsistencies in the Javascript itself. Indeed, in the POS, a refund to the client is entered as a negative number. For example, `4.245` will be rounded to `4.25`, but a refund of `-4.245` will be rounded to `-4.24`. The payment and the refund are not consistent. Sources: - http://www.ecma-international.org/ecma-262/6.0/index.html#sec-math.round - https://docs.python.org/2/library/functions.html#round - https://en.wikipedia.org/wiki/Rounding#Round_half_up Fixes #9249 opw-653034
This commit is contained in:
parent
2f35c40714
commit
ea2c80cad0
|
@ -350,7 +350,16 @@ instance.web.round_precision = function(value, precision){
|
|||
var epsilon_magnitude = Math.log(Math.abs(normalized_value))/Math.log(2);
|
||||
var epsilon = Math.pow(2, epsilon_magnitude - 53);
|
||||
normalized_value += normalized_value >= 0 ? epsilon : -epsilon;
|
||||
var rounded_value = Math.round(normalized_value);
|
||||
|
||||
/**
|
||||
* Javascript performs strictly the round half up method, which is asymmetric. However, in
|
||||
* Python, the method is symmetric. For example:
|
||||
* - In JS, Math.round(-0.5) is equal to -0.
|
||||
* - In Python, round(-0.5) is equal to -1.
|
||||
* We want to keep the Python behavior for consistency.
|
||||
*/
|
||||
var sign = normalized_value < 0 ? -1.0 : 1.0;
|
||||
var rounded_value = sign * Math.round(Math.abs(normalized_value));
|
||||
return rounded_value * precision;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue