Skip to content

Commit 981a8a9

Browse files
committed
[BUGFIX] #344 minumum(0, -0) should be -0
1 parent 2603bfd commit 981a8a9

File tree

3 files changed

+44
-28
lines changed

3 files changed

+44
-28
lines changed

bignumber.js

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@
637637
* arguments {number|string|BigNumber}
638638
*/
639639
BigNumber.maximum = BigNumber.max = function () {
640-
return maxOrMin(arguments, P.lt);
640+
return maxOrMin(arguments, -1);
641641
};
642642

643643

@@ -647,7 +647,7 @@
647647
* arguments {number|string|BigNumber}
648648
*/
649649
BigNumber.minimum = BigNumber.min = function () {
650-
return maxOrMin(arguments, P.gt);
650+
return maxOrMin(arguments, 1);
651651
};
652652

653653

@@ -1291,24 +1291,20 @@
12911291

12921292

12931293
// Handle BigNumber.max and BigNumber.min.
1294-
function maxOrMin(args, method) {
1295-
var n,
1294+
// If any number is NaN, return NaN.
1295+
function maxOrMin(args, n) {
1296+
var k, y,
12961297
i = 1,
1297-
m = new BigNumber(args[0]);
1298+
x = new BigNumber(args[0]);
12981299

12991300
for (; i < args.length; i++) {
1300-
n = new BigNumber(args[i]);
1301-
1302-
// If any number is NaN, return NaN.
1303-
if (!n.s) {
1304-
m = n;
1305-
break;
1306-
} else if (method.call(m, n)) {
1307-
m = n;
1301+
y = new BigNumber(args[i]);
1302+
if (!y.s || (k = compare(x, y)) === n || k === 0 && x.s === n) {
1303+
x = y;
13081304
}
13091305
}
13101306

1311-
return m;
1307+
return x;
13121308
}
13131309

13141310

bignumber.mjs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ function clone(configObject) {
634634
* arguments {number|string|BigNumber}
635635
*/
636636
BigNumber.maximum = BigNumber.max = function () {
637-
return maxOrMin(arguments, P.lt);
637+
return maxOrMin(arguments, -1);
638638
};
639639

640640

@@ -644,7 +644,7 @@ function clone(configObject) {
644644
* arguments {number|string|BigNumber}
645645
*/
646646
BigNumber.minimum = BigNumber.min = function () {
647-
return maxOrMin(arguments, P.gt);
647+
return maxOrMin(arguments, 1);
648648
};
649649

650650

@@ -1288,24 +1288,20 @@ function clone(configObject) {
12881288

12891289

12901290
// Handle BigNumber.max and BigNumber.min.
1291-
function maxOrMin(args, method) {
1292-
var n,
1291+
// If any number is NaN, return NaN.
1292+
function maxOrMin(args, n) {
1293+
var k, y,
12931294
i = 1,
1294-
m = new BigNumber(args[0]);
1295+
x = new BigNumber(args[0]);
12951296

12961297
for (; i < args.length; i++) {
1297-
n = new BigNumber(args[i]);
1298-
1299-
// If any number is NaN, return NaN.
1300-
if (!n.s) {
1301-
m = n;
1302-
break;
1303-
} else if (method.call(m, n)) {
1304-
m = n;
1298+
y = new BigNumber(args[i]);
1299+
if (!y.s || (k = compare(x, y)) === n || k === 0 && x.s === n) {
1300+
x = y;
13051301
}
13061302
}
13071303

1308-
return m;
1304+
return x;
13091305
}
13101306

13111307

test/methods/minmax.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,30 @@ Test('minimum and maximum', function () {
1616
Test.areEqual(BigNumber.maximum, BigNumber.max);
1717
Test.areEqual(BigNumber.minimum, BigNumber.min);
1818

19+
function isMinusZero(x) {
20+
return x.isZero() && x.isNegative();
21+
}
22+
23+
t(isMinusZero(BigNumber.min(-0, 0)));
24+
t(isMinusZero(BigNumber.min(0, -0)));
25+
t(isMinusZero(BigNumber.min('-0', '0')));
26+
t(isMinusZero(BigNumber.min('0', '-0')));
27+
t(isMinusZero(BigNumber.min(-0, 1, 0, 2)));
28+
t(isMinusZero(BigNumber.min(0, 1, 2, -0)));
29+
t(isMinusZero(BigNumber.min(2, 1, -0, 0)));
30+
31+
function isPositiveZero(x) {
32+
return x.isZero() && x.isPositive();
33+
}
34+
35+
t(isPositiveZero(BigNumber.max(-0, 0)));
36+
t(isPositiveZero(BigNumber.max(0, -0)));
37+
t(isPositiveZero(BigNumber.max('-0', '0')));
38+
t(isPositiveZero(BigNumber.max('0', '-0')));
39+
t(isPositiveZero(BigNumber.max(0, -1, -0, -2)));
40+
t(isPositiveZero(BigNumber.max(0, -1, 0, -2, -0)));
41+
t(isPositiveZero(BigNumber.max(-0, -1, -2, -0, 0)));
42+
1943
t(!BigNumber.min(0, 0, 0).isNaN());
2044
t(BigNumber.min(NaN, -2, 0, -1).isNaN());
2145
t(BigNumber.max(NaN, -2, 0, -1).isNaN());

0 commit comments

Comments
 (0)