From c12ee2b2b520a728670724692eb6c47063d4bfb0 Mon Sep 17 00:00:00 2001 From: Ovilia Date: Fri, 25 Oct 2019 14:10:04 +0800 Subject: [PATCH 1/2] fix: quantityExponent #11249 --- src/util/number.js | 10 +++++++++- test/ut/spec/util/number.js | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/util/number.js b/src/util/number.js index 106fc4ffd5..aecd858415 100644 --- a/src/util/number.js +++ b/src/util/number.js @@ -394,7 +394,15 @@ export function quantity(val) { * @return {number} */ export function quantityExponent(val) { - return val > 0 ? Math.floor(Math.log(val) / Math.LN10) : 0; + if (val === 0) { + return 0; + } + + var exp = Math.floor(Math.log(val) / Math.LN10); + if (val / Math.pow(10, exp) >= 10) { + exp++; + } + return exp; } /** diff --git a/test/ut/spec/util/number.js b/test/ut/spec/util/number.js index 154152eac6..f185c5baf6 100755 --- a/test/ut/spec/util/number.js +++ b/test/ut/spec/util/number.js @@ -401,6 +401,7 @@ describe('util/number', function () { expect(numberUtil.quantityExponent(1234)).toEqual(3); expect(numberUtil.quantityExponent(1234.5678)).toEqual(3); expect(numberUtil.quantityExponent(10)).toEqual(1); + expect(numberUtil.quantityExponent(1000)).toEqual(3); expect(numberUtil.quantityExponent(10000)).toEqual(4); }); @@ -429,6 +430,7 @@ describe('util/number', function () { expect(numberUtil.quantity(1234)).toEqual(1000); expect(numberUtil.quantity(1234.5678)).toEqual(1000); expect(numberUtil.quantity(10)).toEqual(10); + expect(numberUtil.quantity(1000)).toEqual(1000); expect(numberUtil.quantity(10000)).toEqual(10000); }); From 15f6c3a0e7d45db8120ae1cdc0adabb048aa0bc5 Mon Sep 17 00:00:00 2001 From: Ovilia Date: Fri, 25 Oct 2019 14:37:01 +0800 Subject: [PATCH 2/2] style: add comment --- src/util/number.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/util/number.js b/src/util/number.js index aecd858415..cf84e9a152 100644 --- a/src/util/number.js +++ b/src/util/number.js @@ -399,6 +399,11 @@ export function quantityExponent(val) { } var exp = Math.floor(Math.log(val) / Math.LN10); + /** + * exp is expected to be the rounded-down result of the base-10 log of val. + * But due to the precision loss with Math.log(val), we need to restore it + * using 10^exp to make sure we can get val back from exp. #11249 + */ if (val / Math.pow(10, exp) >= 10) { exp++; }