From c17052daa792f22c4dd803d2cfab33ad95de33b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20=C3=89vrard?= Date: Mon, 19 May 2025 11:31:28 +0200 Subject: [PATCH] Use the initial precision when applying factor to a field without digits Without digits the full representation of the number is used which might not be the expected behaviour because applying the factor will result in a number which short representation could be surprising to the user. Closes #10460 (grafted from 6b292fe0dbb05cebbc17ba7fbbddb19d39f675dc) --HG-- branch : 6.0 --- sao/src/model.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/sao/src/model.js b/sao/src/model.js index d9f3a09b6f..a5c8e0cfc3 100644 --- a/sao/src/model.js +++ b/sao/src/model.js @@ -1950,12 +1950,23 @@ }, apply_factor: function(record, value, factor) { if (value !== null) { + // The default precision is the one used by value (before + // applying the factor), per the ecmascript specification + // it's the shortest representation of said value. + // Once the factor is applied the number might become even + // more inexact thus we should rely on the initial + // precision + the effect factor will have + // https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#sec-numeric-types-number-tostring + let default_precision = (value.toString().split('.')[1] || '').length; + default_precision += Math.ceil(Math.log10(factor)); value /= factor; var digits = this.digits(record); if (digits) { // Round to avoid float precision error // after the division by factor value = value.toFixed(digits[1]); + } else { + value = value.toFixed(default_precision); } value = this.convert(value); }