Skip to content
This repository was archived by the owner on Dec 27, 2023. It is now read-only.

Commit 59bc3c2

Browse files
committed
Merge pull request #38 from shabbyrobe/master
Fixed truncation when scale not passed to comp(), thanks to @shabbyrobe .
2 parents 64c696a + 0d06bb7 commit 59bc3c2

File tree

2 files changed

+60
-3
lines changed

2 files changed

+60
-3
lines changed

src/Decimal.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -545,10 +545,12 @@ public function comp(Decimal $b, $scale = null)
545545
return -$b->comp($this);
546546
}
547547

548+
$cmp_scale = $scale !== null ? $scale : max($this->scale, $b->scale);
549+
548550
return bccomp(
549-
self::innerRound($this->value, $scale),
550-
self::innerRound($b->value, $scale),
551-
$scale
551+
self::innerRound($this->value, $cmp_scale),
552+
self::innerRound($b->value, $cmp_scale),
553+
$cmp_scale
552554
);
553555
}
554556

tests/Decimal/DecimalCompTest.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,59 @@ public function testBasicCases()
2222
$this->assertTrue($one->comp($ten) === -1);
2323
$this->assertTrue($ten->comp($one) === 1);
2424
}
25+
26+
public function testUnscaledComp()
27+
{
28+
// Transitivity
29+
$this->assertEquals(-1, Decimal::fromFloat(1.001)->comp(Decimal::fromFloat(1.01)));
30+
$this->assertEquals(1, Decimal::fromFloat(1.01)->comp(Decimal::fromFloat(1.004)));
31+
$this->assertEquals(-1, Decimal::fromFloat(1.001)->comp(Decimal::fromFloat(1.004)));
32+
33+
// Reflexivity
34+
$this->assertEquals(0, Decimal::fromFloat(1.00525)->comp(Decimal::fromFloat(1.00525)));
35+
36+
// Symmetry
37+
$this->assertEquals(1, Decimal::fromFloat(1.01)->comp(Decimal::fromFloat(1.001)));
38+
$this->assertEquals(-1, Decimal::fromFloat(1.004)->comp(Decimal::fromFloat(1.01)));
39+
$this->assertEquals(1, Decimal::fromFloat(1.004)->comp(Decimal::fromFloat(1.001)));
40+
41+
$this->assertEquals(1, Decimal::fromFloat(1.004)->comp(Decimal::fromFloat(1.000)));
42+
43+
// Warning, float to Decimal conversion can have unexpected behaviors, like converting
44+
// 1.005 to Decimal("1.0049999999999999")
45+
$this->assertEquals(-1, Decimal::fromFloat(1.0050000000001)->comp(Decimal::fromFloat(1.010)));
46+
47+
$this->assertEquals(-1, Decimal::fromString("1.005")->comp(Decimal::fromString("1.010")));
48+
49+
# Proper rounding
50+
$this->assertEquals(-1, Decimal::fromFloat(1.004)->comp(Decimal::fromFloat(1.0050000000001)));
51+
}
52+
53+
public function testScaledComp()
54+
{
55+
// Transitivity
56+
$this->assertEquals(0, Decimal::fromFloat(1.001)->comp(Decimal::fromFloat(1.01), 1));
57+
$this->assertEquals(0, Decimal::fromFloat(1.01)->comp(Decimal::fromFloat(1.004), 1));
58+
$this->assertEquals(0, Decimal::fromFloat(1.001)->comp(Decimal::fromFloat(1.004), 1));
59+
60+
// Reflexivity
61+
$this->assertEquals(0, Decimal::fromFloat(1.00525)->comp(Decimal::fromFloat(1.00525), 2));
62+
63+
// Symmetry
64+
$this->assertEquals(0, Decimal::fromFloat(1.01)->comp(Decimal::fromFloat(1.001), 1));
65+
$this->assertEquals(0, Decimal::fromFloat(1.004)->comp(Decimal::fromFloat(1.01), 1));
66+
$this->assertEquals(0, Decimal::fromFloat(1.004)->comp(Decimal::fromFloat(1.001), 1));
67+
68+
// Proper rounding
69+
$this->assertEquals(0, Decimal::fromFloat(1.004)->comp(Decimal::fromFloat(1.000), 2));
70+
71+
// Warning, float to Decimal conversion can have unexpected behaviors, like converting
72+
// 1.005 to Decimal("1.0049999999999999")
73+
$this->assertEquals(0, Decimal::fromFloat(1.0050000000001)->comp(Decimal::fromFloat(1.010), 2));
74+
75+
$this->assertEquals(0, Decimal::fromString("1.005")->comp(Decimal::fromString("1.010"), 2));
76+
77+
# Proper rounding
78+
$this->assertEquals(-1, Decimal::fromFloat(1.004)->comp(Decimal::fromFloat(1.0050000000001), 2));
79+
}
2580
}

0 commit comments

Comments
 (0)