Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f54599a

Browse files
committed
Fix josdejong#1530: apply rounding first and lowerExp and upperExp second when formatting a number
1 parent 45344e8 commit f54599a

5 files changed

Lines changed: 32 additions & 7 deletions

File tree

HISTORY.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@
121121
for `candela`. Thanks @mcvladthegoat.
122122
- Fixed `epsilon` setting being applied globally to Complex numbers.
123123
- Fix `math.simplify('add(2, 3)')` throwing an error.
124+
- Fix #1530: number formatting first applied `lowerExp` and `upperExp`
125+
and after that rounded the value instead of the other way around.
124126
125127
126128
# 2019-05-18, version 5.10.3

src/utils/bignumber/formatter.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,11 @@ export function format (value, options) {
141141

142142
// determine whether or not to output exponential notation
143143
let str
144-
const exp = value.e
144+
const rounded = value.toSignificantDigits(precision)
145+
const exp = rounded.e
145146
if (exp >= lowerExp && exp < upperExp) {
146147
// normal number notation
147-
str = value.toSignificantDigits(precision).toFixed()
148+
str = rounded.toFixed()
148149
} else {
149150
// exponential notation
150151
str = toExponential(value, precision)

src/utils/number.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -444,11 +444,11 @@ export function toPrecision (value, precision, options) {
444444
const upperExp = (options && options.upperExp !== undefined) ? options.upperExp : 5
445445

446446
const split = splitNumber(value)
447-
if (split.exponent < lowerExp || split.exponent >= upperExp) {
447+
const rounded = precision ? roundDigits(split, precision) : split
448+
if (rounded.exponent < lowerExp || rounded.exponent >= upperExp) {
448449
// exponential notation
449450
return toExponential(value, precision)
450451
} else {
451-
const rounded = precision ? roundDigits(split, precision) : split
452452
let c = rounded.coefficients
453453
const e = rounded.exponent
454454

test/utils/bignumber/formatter.test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,18 @@ describe('format', function () {
114114
assert.strictEqual(format(new B(0.999e-6), options), '9.99e-7')
115115
assert.strictEqual(format(new B(123456789123), options), '1.23456789123e+11')
116116
})
117+
118+
it('auto notation with custom lower and upper bound (2)', function () {
119+
assert.strictEqual(format(new B(1), { lowerExp: -2 }), '1')
120+
assert.strictEqual(format(new B(0.1), { lowerExp: -2 }), '0.1')
121+
assert.strictEqual(format(new B(0.01), { lowerExp: -2 }), '0.01')
122+
assert.strictEqual(format(new B(0.001), { lowerExp: -2 }), '1e-3')
123+
124+
assert.strictEqual(format(new B(0.009), { lowerExp: -2, precision: 1 }), '9e-3')
125+
assert.strictEqual(format(new B(0.0096), { lowerExp: -2, precision: 1 }), '0.01')
126+
assert.strictEqual(format(new B(0.01), { lowerExp: -2, precision: 1 }), '0.01')
127+
assert.strictEqual(format(new B(0.001), { lowerExp: -2, precision: 1 }), '1e-3')
128+
})
117129
})
118130

119131
it('should format bignumbers with a custom formatting function', function () {

test/utils/number.test.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,16 @@ describe('number', function () {
288288
})
289289

290290
it('auto notation with very small custom lower bound', function () {
291+
assert.strictEqual(format(1, { lowerExp: -2 }), '1')
292+
assert.strictEqual(format(0.1, { lowerExp: -2 }), '0.1')
293+
assert.strictEqual(format(0.01, { lowerExp: -2 }), '0.01')
294+
assert.strictEqual(format(0.001, { lowerExp: -2 }), '1e-3')
295+
296+
assert.strictEqual(format(0.009, { lowerExp: -2, precision: 1 }), '9e-3')
297+
assert.strictEqual(format(0.0096, { lowerExp: -2, precision: 1 }), '0.01')
298+
assert.strictEqual(format(0.01, { lowerExp: -2, precision: 1 }), '0.01')
299+
assert.strictEqual(format(0.001, { lowerExp: -2, precision: 1 }), '1e-3')
300+
291301
assert.strictEqual(format(1e-18, { lowerExp: -30 }), '0.000000000000000001')
292302
assert.strictEqual(format(1e-19, { lowerExp: -30 }), '0.0000000000000000001')
293303
assert.strictEqual(format(1e-20, { lowerExp: -30 }), '0.00000000000000000001')
@@ -331,7 +341,7 @@ describe('number', function () {
331341
assert.strictEqual(format(1234567, options), '1235000')
332342
assert.strictEqual(format(1e+9, options), '1e+9')
333343
assert.strictEqual(format(1.1e+9, options), '1.1e+9')
334-
assert.strictEqual(format(1e+9 - 1, options), '1000000000')
344+
assert.strictEqual(format(1e+9 - 1, options), '1e+9')
335345
assert.strictEqual(format(1e-6, options), '0.000001')
336346
assert.strictEqual(format(0.999e-6, options), '9.99e-7')
337347
assert.strictEqual(format(123456789123, options), '1.235e+11')
@@ -451,8 +461,8 @@ describe('number', function () {
451461
assert.strictEqual(toPrecision(0.004, 3), '0.00400')
452462
assert.strictEqual(toPrecision(0.00123456, 5), '0.0012346')
453463
assert.strictEqual(toPrecision(999, 2), '1000')
454-
assert.strictEqual(toPrecision(99900, 2), '100000')
455-
assert.strictEqual(toPrecision(99999, 2), '100000')
464+
assert.strictEqual(toPrecision(99900, 2), '1.0e+5')
465+
assert.strictEqual(toPrecision(99999, 2), '1.0e+5')
456466
assert.strictEqual(toPrecision(999e7, 2), '1.0e+10')
457467
assert.strictEqual(toPrecision(0.00999, 2), '0.010')
458468
assert.strictEqual(toPrecision(-0.00999, 2), '-0.010')

0 commit comments

Comments
 (0)