Skip to content

Commit 8666ec5

Browse files
committed
make multiply and division accepts floats
1 parent e18dfc1 commit 8666ec5

File tree

2 files changed

+38
-29
lines changed

2 files changed

+38
-29
lines changed

src/Money/Money.php

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -184,19 +184,12 @@ public function subtract(Money $subtrahend)
184184

185185
/**
186186
* @param $multiplier
187-
* @param int|\Money\RoundingMode $rounding_mode
188187
* @return Money
189188
*/
190-
public function multiply($multiplier, $rounding_mode = self::ROUND_HALF_UP)
189+
public function multiply($multiplier)
191190
{
192191
$this->assertOperand($multiplier);
193-
194-
if (!$rounding_mode instanceof RoundingMode) {
195-
$rounding_mode = new RoundingMode($rounding_mode);
196-
}
197-
198-
$product = (int)round($this->amount * $multiplier, 0, $rounding_mode->getRoundingMode());
199-
192+
$product = $this->amount * $multiplier;
200193
return new Money($product, $this->currency);
201194
}
202195

@@ -212,19 +205,12 @@ private function assertOperand($operand)
212205

213206
/**
214207
* @param $divisor
215-
* @param int|\Money\RoundingMode $rounding_mode
216208
* @return Money
217209
*/
218-
public function divide($divisor, $rounding_mode = self::ROUND_HALF_UP)
210+
public function divide($divisor)
219211
{
220212
$this->assertOperand($divisor);
221-
222-
if (!$rounding_mode instanceof RoundingMode) {
223-
$rounding_mode = new RoundingMode($rounding_mode);
224-
}
225-
226-
$quotient = (int)round($this->amount / $divisor, 0, $rounding_mode->getRoundingMode());
227-
213+
$quotient = $this->amount / $divisor;
228214
return new Money($quotient, $this->currency);
229215
}
230216

tests/Money/Tests/MoneyTest.php

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,29 @@ public function testFactoryMethods()
5050
);
5151
}
5252

53+
public static function assertEquals(
54+
$expected, $actual, $message = '', $delta = 0, $maxDepth = 10,
55+
$canonicalize = FALSE, $ignoreCase = FALSE)
56+
{
57+
if ($expected instanceof Money && $actual instanceof Money) {
58+
self::assertEquals(
59+
$expected->getAmount(),
60+
$actual->getAmount()
61+
);
62+
self::assertEquals(
63+
$expected->getCurrency(),
64+
$actual->getCurrency()
65+
);
66+
} elseif (is_float($expected) && is_float($actual) && $delta == 0) {
67+
$delta = 0.000000001;
68+
parent::assertEquals($expected, $actual, $message, $delta, $maxDepth,
69+
$canonicalize, $ignoreCase);
70+
} else {
71+
parent::assertEquals($expected, $actual, $message, $delta, $maxDepth,
72+
$canonicalize, $ignoreCase);
73+
}
74+
}
75+
5376
public function testGetters()
5477
{
5578
$m = new Money(100, $euro = new Currency('EUR'));
@@ -79,10 +102,10 @@ public function testEquality()
79102

80103
public function testAddition()
81104
{
82-
$m1 = new Money(100, new Currency('EUR'));
83-
$m2 = new Money(100, new Currency('EUR'));
105+
$m1 = new Money(100.10, new Currency('EUR'));
106+
$m2 = new Money(100.02, new Currency('EUR'));
84107
$sum = $m1->add($m2);
85-
$expected = new Money(200, new Currency('EUR'));
108+
$expected = new Money(200.12, new Currency('EUR'));
86109

87110
$this->assertEquals($expected, $sum);
88111

@@ -103,10 +126,10 @@ public function testDifferentCurrenciesCannotBeAdded()
103126

104127
public function testSubtraction()
105128
{
106-
$m1 = new Money(100, new Currency('EUR'));
107-
$m2 = new Money(200, new Currency('EUR'));
129+
$m1 = new Money(100.66, new Currency('EUR'));
130+
$m2 = new Money(200.33, new Currency('EUR'));
108131
$diff = $m1->subtract($m2);
109-
$expected = new Money(-100, new Currency('EUR'));
132+
$expected = new Money(-99.67, new Currency('EUR'));
110133

111134
$this->assertEquals($expected, $diff);
112135

@@ -129,11 +152,11 @@ public function testMultiplication()
129152
{
130153
$m = new Money(1, new Currency('EUR'));
131154
$this->assertEquals(
132-
new Money(2, new Currency('EUR')),
155+
new Money(1.5, new Currency('EUR')),
133156
$m->multiply(1.5)
134157
);
135158
$this->assertEquals(
136-
new Money(1, new Currency('EUR')),
159+
new Money(1.5, new Currency('EUR')),
137160
$m->multiply(1.5, Money::ROUND_HALF_DOWN)
138161
);
139162

@@ -144,15 +167,15 @@ public function testDivision()
144167
{
145168
$m = new Money(10, new Currency('EUR'));
146169
$this->assertEquals(
147-
new Money(3, new Currency('EUR')),
170+
new Money(3.333333333, new Currency('EUR')),
148171
$m->divide(3)
149172
);
150173
$this->assertEquals(
151-
new Money(2, new Currency('EUR')),
174+
new Money(2.5, new Currency('EUR')),
152175
$m->divide(4, Money::ROUND_HALF_EVEN)
153176
);
154177
$this->assertEquals(
155-
new Money(3, new Currency('EUR')),
178+
new Money(3.333333333, new Currency('EUR')),
156179
$m->divide(3, Money::ROUND_HALF_ODD)
157180
);
158181

0 commit comments

Comments
 (0)