assertBigDecimalEquals($unscaledValue, $scale, BigDecimal::of($value)); } /** * @return array */ public function providerOf() { return [ [0, '0', 0], [1, '1', 0], [-1, '-1', 0], [123456789, '123456789', 0], [-123456789, '-123456789', 0], [PHP_INT_MAX, (string) PHP_INT_MAX, 0], [~PHP_INT_MAX, (string) ~PHP_INT_MAX, 0], [0.0, '0', 0], [0.1, '1', 1], [1.0, '1', 0], [1.1, '11', 1], ['0', '0', 0], ['+0', '0', 0], ['-0', '0', 0], ['00', '0', 0], ['+00', '0', 0], ['-00', '0', 0], ['1', '1', 0], ['+1', '1', 0], ['-1', '-1', 0], ['01', '1', 0], ['+01', '1', 0], ['-01', '-1', 0], ['0.0', '0', 1], ['+0.0', '0', 1], ['-0.0', '0', 1], ['00.0', '0', 1], ['+00.0', '0', 1], ['-00.0', '0', 1], ['1.0', '10', 1], ['+1.0', '10', 1], ['-1.0', '-10', 1], ['01.0', '10', 1], ['+01.0', '10', 1], ['-01.0', '-10', 1], ['0.1', '1', 1], ['+0.1', '1', 1], ['-0.1', '-1', 1], ['0.10', '10', 2], ['+0.10', '10', 2], ['-0.10', '-10', 2], ['0.010', '10', 3], ['+0.010', '10', 3], ['-0.010', '-10', 3], ['00.1', '1', 1], ['+00.1', '1', 1], ['-00.1', '-1', 1], ['00.10', '10', 2], ['+00.10', '10', 2], ['-00.10', '-10', 2], ['00.010', '10', 3], ['+00.010', '10', 3], ['-00.010', '-10', 3], ['01.1', '11', 1], ['+01.1', '11', 1], ['-01.1', '-11', 1], ['01.010', '1010', 3], ['+01.010', '1010', 3], ['-01.010', '-1010', 3], ['0e-2', '0', 2], ['0e-1', '0', 1], ['0e-0', '0', 0], ['0e0', '0', 0], ['0e1', '0', 0], ['0e2', '0', 0], ['0e+0', '0', 0], ['0e+1','0', 0], ['0e+2','0', 0], ['0.0e-2', '0', 3], ['0.0e-1', '0', 2], ['0.0e-0', '0', 1], ['0.0e0', '0', 1], ['0.0e1', '0', 0], ['0.0e2', '0', 0], ['0.0e+0', '0', 1], ['0.0e+1','0', 0], ['0.0e+2','0', 0], ['0.1e-2', '1', 3], ['0.1e-1', '1', 2], ['0.1e-0', '1', 1], ['0.1e0', '1', 1], ['0.1e1', '1', 0], ['0.1e2', '10', 0], ['0.1e+0', '1', 1], ['0.1e+1','1', 0], ['0.1e+2','10', 0], ['1.23e+011', '123000000000', 0], ['1.23e-011', '123', 13], ['0.01e-2', '1', 4], ['0.01e-1', '1', 3], ['0.01e-0', '1', 2], ['0.01e0', '1', 2], ['0.01e1', '1', 1], ['0.01e2', '1', 0], ['0.01e+0', '1', 2], ['0.01e+1','1', 1], ['0.01e+2','1', 0], ['0.10e-2', '10', 4], ['0.10e-1', '10', 3], ['0.10e-0', '10', 2], ['0.10e0', '10', 2], ['0.10e1', '10', 1], ['0.10e2', '10', 0], ['0.10e+0', '10', 2], ['0.10e+1','10', 1], ['0.10e+2','10', 0], ['00.10e-2', '10', 4], ['+00.10e-1', '10', 3], ['-00.10e-0', '-10', 2], ['00.10e0', '10', 2], ['+00.10e1', '10', 1], ['-00.10e2', '-10', 0], ['00.10e+0', '10', 2], ['+00.10e+1','10', 1], ['-00.10e+2','-10', 0], ]; } /** * @dataProvider providerOfInvalidValueThrowsException * @expectedException \Brick\Math\Exception\NumberFormatException * * @param string $value */ public function testOfInvalidValueThrowsException($value) { BigDecimal::of($value); } /** * @return array */ public function providerOfInvalidValueThrowsException() { return [ [''], ['a'], [' 1'], ['1 '], ['1.'], ['.1'], ['+'], ['-'], ['+a'], ['-a'] ]; } public function testOfBigDecimalReturnsThis() { $decimal = BigDecimal::of(123); $this->assertSame($decimal, BigDecimal::of($decimal)); } /** * @dataProvider providerOfUnscaledValue * * @param string|int $unscaledValue The unscaled value of the BigDecimal to create. * @param int $scale The scale of the BigDecimal to create. * @param string $expectedUnscaledValue The expected result unscaled value. */ public function testOfUnscaledValue($unscaledValue, $scale, $expectedUnscaledValue) { $number = BigDecimal::ofUnscaledValue($unscaledValue, $scale); $this->assertBigDecimalEquals($expectedUnscaledValue, $scale, $number); } /** * @return array */ public function providerOfUnscaledValue() { return [ [123456789, 0, '123456789'], [123456789, 1, '123456789'], [-123456789, 0, '-123456789'], [-123456789, 1, '-123456789'], ['123456789012345678901234567890', 0, '123456789012345678901234567890'], ['123456789012345678901234567890', 1, '123456789012345678901234567890'], ['+123456789012345678901234567890', 0, '123456789012345678901234567890'], ['+123456789012345678901234567890', 1, '123456789012345678901234567890'], ['-123456789012345678901234567890', 0, '-123456789012345678901234567890'], ['-123456789012345678901234567890', 1, '-123456789012345678901234567890'], ['0123456789012345678901234567890', 0, '123456789012345678901234567890'], ['0123456789012345678901234567890', 1, '123456789012345678901234567890'], ['+0123456789012345678901234567890', 0, '123456789012345678901234567890'], ['+0123456789012345678901234567890', 1, '123456789012345678901234567890'], ['-0123456789012345678901234567890', 0, '-123456789012345678901234567890'], ['-0123456789012345678901234567890', 1, '-123456789012345678901234567890'], ]; } /** * @expectedException \InvalidArgumentException */ public function testOfUnscaledValueWithNegativeScaleThrowsException() { BigDecimal::ofUnscaledValue('0', -1); } public function testZero() { $this->assertBigDecimalEquals('0', 0, BigDecimal::zero()); } /** * @dataProvider providerMin * * @param array $values The values to test. * @param int $index The index of the minimum value in the test array. */ public function testMin(array $values, $index) { $this->assertTrue(BigDecimal::min(...$values)->isEqualTo($values[$index])); } /** * @return array */ public function providerMin() { return [ [[0, 1, -1], 2], [[0, 1, -1, -1.2], 3], [['1e30', '123456789123456789123456789', 2e25], 2], [['1e30', '123456789123456789123456789', 2e26], 1], [[0, '10', '5989', '-1'], 3], [['-0.0000000000000000000000000000001', '0'], 0], [['0.00000000000000000000000000000001', '0'], 1], [['-1', '1', '2', '3', '-99.1'], 4], [['999999999999999999999999999.99999999999', '1000000000000000000000000000'], 0], [['-999999999999999999999999999.99999999999', '-1000000000000000000000000000'], 1], [['9.9e50', '1e50'], 1], [['9.9e50', '1e51'], 0], ]; } /** * @expectedException \InvalidArgumentException */ public function testMinOfZeroValuesThrowsException() { BigDecimal::min(); } /** * @dataProvider providerMax * * @param array $values The values to test. * @param int $index The index of the maximum value in the test array. */ public function testMax(array $values, $index) { $this->assertTrue(BigDecimal::max(...$values)->isEqualTo($values[$index])); } /** * @return array */ public function providerMax() { return [ [[0, 0.9, -1.00], 1], [[0, 0.01, -1, -1.2], 1], [[0, 0.01, -1, -1.2, '2e-1'], 4], [['1e-30', '123456789123456789123456789', 2e25], 1], [['1e-30', '123456789123456789123456789', 2e26], 2], [[0, '10', '5989', '-1'], 2], [[0, '10', '5989', '5989.000000000000000000000000000000001', '-1'], 3], [[0, '10', '5989', '5989.000000000000000000000000000000001', '-1', '5990'], 5], [['-0.0000000000000000000000000000001', '0'], 1], [['0.00000000000000000000000000000001', '0'], 0], [['-1', '1', '2', '3', '-99.1'], 3], [['-1', '1', '2', '3', '-99.1', '3.1'], 5], [['999999999999999999999999999.99999999999', '1000000000000000000000000000'], 1], [['-999999999999999999999999999.99999999999', '-1000000000000000000000000000'], 0], [['9.9e50', '1e50'], 0], [['9.9e50', '1e51'], 1], ]; } /** * @expectedException \InvalidArgumentException */ public function testMaxOfZeroValuesThrowsException() { BigDecimal::max(); } /** * @dataProvider providerPlus * * @param string $a The base number. * @param string $b The number to add. * @param string $unscaledValue The expected unscaled value. * @param int $scale The expected scale. */ public function testPlus($a, $b, $unscaledValue, $scale) { $this->assertBigDecimalEquals($unscaledValue, $scale, BigDecimal::of($a)->plus($b)); } /** * @return array */ public function providerPlus() { return [ ['123', '999', '1122', 0], ['123', '999.0', '11220', 1], ['123', '999.00', '112200', 2], ['123.0', '999', '11220', 1], ['123.0', '999.0', '11220', 1], ['123.0', '999.00', '112200', 2], ['123.00', '999', '112200', 2], ['123.00', '999.0', '112200', 2], ['123.00', '999.00', '112200', 2], ['123', '-999', '-876', 0], ['123', '-999.0', '-8760', 1], ['123', '-999.00', '-87600', 2], ['123.0', '-999', '-8760', 1], ['123.0', '-999.0', '-8760', 1], ['123.0', '-999.00', '-87600', 2], ['123.00', '-999', '-87600', 2], ['123.00', '-999.0', '-87600', 2], ['123.00', '-999.00', '-87600', 2], ['-123', '999', '876', 0], ['-123', '999.0', '8760', 1], ['-123', '999.00', '87600', 2], ['-123.0', '999', '8760', 1], ['-123.0', '999.0', '8760', 1], ['-123.0', '999.00', '87600', 2], ['-123.00', '999', '87600', 2], ['-123.00', '999.0', '87600', 2], ['-123.00', '999.00', '87600', 2], ['-123', '-999', '-1122', 0], ['-123', '-999.0', '-11220', 1], ['-123', '-999.00', '-112200', 2], ['-123.0', '-999', '-11220', 1], ['-123.0', '-999.0', '-11220', 1], ['-123.0', '-999.00', '-112200', 2], ['-123.00', '-999', '-112200', 2], ['-123.00', '-999.0', '-112200', 2], ['-123.00', '-999.00', '-112200', 2], ['23487837847837428335.322387091', '309049304233535454687656.2392', '309072792071383292115991561587091', 9], ['-234878378478328335.322387091', '309049304233535154687656.232', '309049069355156676359320909612909', 9], ['234878378478328335.3227091', '-3090495154687656.231343344452', '231787883323640679091365755548', 12], ['-23487837847833435.3231', '-3090495154687656.231343344452', '-26578333002521091554443344452', 12], ['1234568798347983.2334899238921', '0', '12345687983479832334899238921', 13], ['-0.00223287647368738736428467863784', '0.000', '-223287647368738736428467863784', 32], ]; } /** * @dataProvider providerMinus * * @param string $a The base number. * @param string $b The number to subtract. * @param string $unscaledValue The expected unscaled value. * @param int $scale The expected scale. */ public function testMinus($a, $b, $unscaledValue, $scale) { $this->assertBigDecimalEquals($unscaledValue, $scale, BigDecimal::of($a)->minus($b)); } /** * @return array */ public function providerMinus() { return [ ['123', '999', '-876', 0], ['123', '999.0', '-8760', 1], ['123', '999.00', '-87600', 2], ['123.0', '999', '-8760', 1], ['123.0', '999.0', '-8760', 1], ['123.0', '999.00', '-87600', 2], ['123.00', '999', '-87600', 2], ['123.00', '999.0', '-87600', 2], ['123.00', '999.00', '-87600', 2], ['123', '-999', '1122', 0], ['123', '-999.0', '11220', 1], ['123', '-999.00', '112200', 2], ['123.0', '-999', '11220', 1], ['123.0', '-999.0', '11220', 1], ['123.0', '-999.00', '112200', 2], ['123.00', '-999', '112200', 2], ['123.00', '-999.0', '112200', 2], ['123.00', '-999.00', '112200', 2], ['-123', '999', '-1122', 0], ['-123', '999.0', '-11220', 1], ['-123', '999.00', '-112200', 2], ['-123.0', '999', '-11220', 1], ['-123.0', '999.0', '-11220', 1], ['-123.0', '999.00', '-112200', 2], ['-123.00', '999', '-112200', 2], ['-123.00', '999.0', '-112200', 2], ['-123.00', '999.00', '-112200', 2], ['-123', '-999', '876', 0], ['-123', '-999.0', '8760', 1], ['-123', '-999.00', '87600', 2], ['-123.0', '-999', '8760', 1], ['-123.0', '-999.0', '8760', 1], ['-123.0', '-999.00', '87600', 2], ['-123.00', '-999', '87600', 2], ['-123.00', '-999.0', '87600', 2], ['-123.00', '-999.00', '87600', 2], ['234878378477428335.3223334343487091', '309049304233536.2392', '2345693291731947990831334343487091', 16], ['-2348783784774335.32233343434891', '309049304233536.233392', '-265783308900787155572543434891', 14], ['2348783784774335.323232342791', '-309049304233536.556172', '2657833089007871879404342791', 12], ['-2348783784774335.3232342791', '-309049304233536.556172', '-20397344805407987670622791', 10], ['1234568798347983.2334899238921', '0', '12345687983479832334899238921', 13], ['-0.00223287647368738736428467863784', '0.000', '-223287647368738736428467863784', 32], ]; } /** * @dataProvider providerMultipliedBy * * @param string $a The base number. * @param string $b The number to multiply. * @param string $unscaledValue The expected unscaled value. * @param int $scale The expected scale. */ public function testMultipliedBy($a, $b, $unscaledValue, $scale) { $this->assertBigDecimalEquals($unscaledValue, $scale, BigDecimal::of($a)->multipliedBy($b)); } /** * @return array */ public function providerMultipliedBy() { return [ ['123', '999', '122877', 0], ['123', '999.0', '1228770', 1], ['123', '999.00', '12287700', 2], ['123.0', '999', '1228770', 1], ['123.0', '999.0', '12287700', 2], ['123.0', '999.00', '122877000', 3], ['123.00', '999', '12287700', 2], ['123.00', '999.0', '122877000', 3], ['123.00', '999.00', '1228770000', 4], ['123', '-999', '-122877', 0], ['123', '-999.0', '-1228770', 1], ['123', '-999.00', '-12287700', 2], ['123.0', '-999', '-1228770', 1], ['123.0', '-999.0', '-12287700', 2], ['123.0', '-999.00', '-122877000', 3], ['123.00', '-999', '-12287700', 2], ['123.00', '-999.0', '-122877000', 3], ['123.00', '-999.00', '-1228770000', 4], ['-123', '999', '-122877', 0], ['-123', '999.0', '-1228770', 1], ['-123', '999.00', '-12287700', 2], ['-123.0', '999', '-1228770', 1], ['-123.0', '999.0', '-12287700', 2], ['-123.0', '999.00', '-122877000', 3], ['-123.00', '999', '-12287700', 2], ['-123.00', '999.0', '-122877000', 3], ['-123.00', '999.00', '-1228770000', 4], ['-123', '-999', '122877', 0], ['-123', '-999.0', '1228770', 1], ['-123', '-999.00', '12287700', 2], ['-123.0', '-999', '1228770', 1], ['-123.0', '-999.0', '12287700', 2], ['-123.0', '-999.00', '122877000', 3], ['-123.00', '-999', '12287700', 2], ['-123.00', '-999.0', '122877000', 3], ['-123.00', '-999.00', '1228770000', 4], ['589252.156111130', '999.2563989942545241223454', '5888139876152080735720775399923986443020', 31], ['-589252.15611130', '999.256398994254524122354', '-58881398761537794715991163083004200020', 29], ['589252.1561113', '-99.256398994254524122354', '-584870471152079471599116308300420002', 28], ['-58952.156111', '-9.256398994254524122357', '545684678534996098129205129273627', 27], ['0.1235437849158495728979344999999999999', '1', '1235437849158495728979344999999999999', 37], ['-1.324985980890283098409328999999999999', '1', '-1324985980890283098409328999999999999', 36], ]; } /** * @dataProvider providerDividedBy * * @param string $a The base number. * @param string $b The number to multiply. * @param int|null $scale The desired scale of the result, or null to skip the parameter. * @param int $roundingMode The rounding mode. * @param string $unscaledValue The expected unscaled value of the result. * @param int $expectedScale The expected scale of the result. */ public function testDividedBy($a, $b, $scale, $roundingMode, $unscaledValue, $expectedScale) { $decimal = BigDecimal::of($a)->dividedBy($b, $roundingMode, $scale); $this->assertBigDecimalEquals($unscaledValue, $expectedScale, $decimal); } /** * @return array */ public function providerDividedBy() { return [ [ '7', '0.2', null, RoundingMode::UNNECESSARY, '35', 0], [ '7', '-0.2', null, RoundingMode::UNNECESSARY, '-35', 0], ['-7', '0.2', null, RoundingMode::UNNECESSARY, '-35', 0], ['-7', '-0.2', null, RoundingMode::UNNECESSARY, '35', 0], ['1324794783847839472983.343898', '1', null, RoundingMode::UNNECESSARY, '1324794783847839472983343898', 6], ['-32479478384783947298.3343898', '1', null, RoundingMode::UNNECESSARY, '-324794783847839472983343898', 7], ['1.5', '2', 2, RoundingMode::UNNECESSARY, '75', 2], ['0.123456789', '0.00244140625', 10, RoundingMode::UNNECESSARY, '505679007744', 10], ['1.234', '123.456', 50, RoundingMode::DOWN, '999546397096941420425090720580611715914981855883', 50], ['1', '3', 10, RoundingMode::UP, '3333333334', 10], ['0.124', '0.2', null, RoundingMode::UNNECESSARY, '620', 3], ['0.124', '2', null, RoundingMode::UNNECESSARY, '62', 3], ]; } /** * @dataProvider providerDividedByZeroThrowsException * @expectedException \Brick\Math\Exception\DivisionByZeroException * * @param string|number $zero */ public function testDividedByZeroThrowsException($zero) { BigDecimal::of(1)->dividedBy($zero); } /** * @return array */ public function providerDividedByZeroThrowsException() { return [ [0], ['0.0'], ['0.00'] ]; } /** * @dataProvider providerDividedByExact * * @param string|number $number The number to divide. * @param string|number $divisor The divisor. * @param string|null $expected The expected result, or null if an exception is expected. */ public function testDividedByExact($number, $divisor, $expected) { if ($expected === null) { $this->setExpectedException(RoundingNecessaryException::class); } $actual = BigDecimal::of($number)->dividedByExact($divisor); if ($expected !== null) { $this->assertSame($expected, (string) $actual); } } /** * @return array */ public function providerDividedByExact() { return [ [1, 1, '1'], ['1.0', '1.00', '1.0'], [1, 2, '0.5'], [1, 3, null], [1, 4, '0.25'], [1, 5, '0.2'], [1, 6, null], [1, 7, null], [1, 8, '0.125'], [1, 9, null], [1, 10, '0.1'], ['1.0', 2, '0.5'], ['1.00', 2, '0.50'], ['1.0000', 8, '0.1250'], [1, '4.000', '0.25'], ['1', '0.125', '8'], ['1.0', '0.125', '8.0'], ]; } /** * @expectedException \Brick\Math\Exception\DivisionByZeroException */ public function testDividedByExactZero() { BigDecimal::of(1)->dividedByExact(0); } /** * @dataProvider providerDividedByWithRoundingNecessaryThrowsException * @expectedException \Brick\Math\Exception\RoundingNecessaryException * * @param string $a The base number. * @param string $b The number to divide by. * @param int|null $scale The desired scale, or null to skip the parameter. */ public function testDividedByWithRoundingNecessaryThrowsException($a, $b, $scale) { BigDecimal::of($a)->dividedBy($b, RoundingMode::UNNECESSARY, $scale); } /** * @return array */ public function providerDividedByWithRoundingNecessaryThrowsException() { return [ ['1.234', '123.456', null], ['7', '2', null], ['7', '3', 100] ]; } /** * @expectedException \InvalidArgumentException */ public function testDividedByWithNegativeScaleThrowsException() { BigDecimal::of(1)->dividedBy(2, RoundingMode::UNNECESSARY, -1); } /** * @expectedException \InvalidArgumentException */ public function testDividedByWithInvalidRoundingModeThrowsException() { BigDecimal::of(1)->dividedBy(2, -1); } /** * @dataProvider providerRoundingMode * * @param int $roundingMode The rounding mode. * @param string $number The number to round. * @param string|null $two The expected rounding to a scale of two, or null if an exception is expected. * @param string|null $one The expected rounding to a scale of one, or null if an exception is expected. * @param string|null $zero The expected rounding to a scale of zero, or null if an exception is expected. */ public function testRoundingMode($roundingMode, $number, $two, $one, $zero) { $number = BigDecimal::of($number); $this->doTestRoundingMode($roundingMode, $number, '1', $two, $one, $zero); $this->doTestRoundingMode($roundingMode, $number->negated(), '-1', $two, $one, $zero); } /** * @param int $roundingMode The rounding mode. * @param BigDecimal $number The number to round. * @param string $divisor The divisor. * @param string|null $two The expected rounding to a scale of two, or null if an exception is expected. * @param string|null $one The expected rounding to a scale of one, or null if an exception is expected. * @param string|null $zero The expected rounding to a scale of zero, or null if an exception is expected. */ private function doTestRoundingMode($roundingMode, BigDecimal $number, $divisor, $two, $one, $zero) { foreach ([$zero, $one, $two] as $scale => $expected) { if ($expected === null) { $this->setExpectedException(RoundingNecessaryException::class); } $actual = $number->dividedBy($divisor, $roundingMode, $scale); if ($expected !== null) { $this->assertBigDecimalEquals($expected, $scale, $actual); } } } /** * @return array */ public function providerRoundingMode() { return [ [RoundingMode::UP, '3.501', '351', '36', '4'], [RoundingMode::UP, '3.500', '350', '35', '4'], [RoundingMode::UP, '3.499', '350', '35', '4'], [RoundingMode::UP, '3.001', '301', '31', '4'], [RoundingMode::UP, '3.000', '300', '30', '3'], [RoundingMode::UP, '2.999', '300', '30', '3'], [RoundingMode::UP, '2.501', '251', '26', '3'], [RoundingMode::UP, '2.500', '250', '25', '3'], [RoundingMode::UP, '2.499', '250', '25', '3'], [RoundingMode::UP, '2.001', '201', '21', '3'], [RoundingMode::UP, '2.000', '200', '20', '2'], [RoundingMode::UP, '1.999', '200', '20', '2'], [RoundingMode::UP, '1.501', '151', '16', '2'], [RoundingMode::UP, '1.500', '150', '15', '2'], [RoundingMode::UP, '1.499', '150', '15', '2'], [RoundingMode::UP, '1.001', '101', '11', '2'], [RoundingMode::UP, '1.000', '100', '10', '1'], [RoundingMode::UP, '0.999', '100', '10', '1'], [RoundingMode::UP, '0.501', '51', '6', '1'], [RoundingMode::UP, '0.500', '50', '5', '1'], [RoundingMode::UP, '0.499', '50', '5', '1'], [RoundingMode::UP, '0.001', '1', '1', '1'], [RoundingMode::UP, '0.000', '0', '0', '0'], [RoundingMode::UP, '-0.001', '-1', '-1', '-1'], [RoundingMode::UP, '-0.499', '-50', '-5', '-1'], [RoundingMode::UP, '-0.500', '-50', '-5', '-1'], [RoundingMode::UP, '-0.501', '-51', '-6', '-1'], [RoundingMode::UP, '-0.999', '-100', '-10', '-1'], [RoundingMode::UP, '-1.000', '-100', '-10', '-1'], [RoundingMode::UP, '-1.001', '-101', '-11', '-2'], [RoundingMode::UP, '-1.499', '-150', '-15', '-2'], [RoundingMode::UP, '-1.500', '-150', '-15', '-2'], [RoundingMode::UP, '-1.501', '-151', '-16', '-2'], [RoundingMode::UP, '-1.999', '-200', '-20', '-2'], [RoundingMode::UP, '-2.000', '-200', '-20', '-2'], [RoundingMode::UP, '-2.001', '-201', '-21', '-3'], [RoundingMode::UP, '-2.499', '-250', '-25', '-3'], [RoundingMode::UP, '-2.500', '-250', '-25', '-3'], [RoundingMode::UP, '-2.501', '-251', '-26', '-3'], [RoundingMode::UP, '-2.999', '-300', '-30', '-3'], [RoundingMode::UP, '-3.000', '-300', '-30', '-3'], [RoundingMode::UP, '-3.001', '-301', '-31', '-4'], [RoundingMode::UP, '-3.499', '-350', '-35', '-4'], [RoundingMode::UP, '-3.500', '-350', '-35', '-4'], [RoundingMode::UP, '-3.501', '-351', '-36', '-4'], [RoundingMode::DOWN, '3.501', '350', '35', '3'], [RoundingMode::DOWN, '3.500', '350', '35', '3'], [RoundingMode::DOWN, '3.499', '349', '34', '3'], [RoundingMode::DOWN, '3.001', '300', '30', '3'], [RoundingMode::DOWN, '3.000', '300', '30', '3'], [RoundingMode::DOWN, '2.999', '299', '29', '2'], [RoundingMode::DOWN, '2.501', '250', '25', '2'], [RoundingMode::DOWN, '2.500', '250', '25', '2'], [RoundingMode::DOWN, '2.499', '249', '24', '2'], [RoundingMode::DOWN, '2.001', '200', '20', '2'], [RoundingMode::DOWN, '2.000', '200', '20', '2'], [RoundingMode::DOWN, '1.999', '199', '19', '1'], [RoundingMode::DOWN, '1.501', '150', '15', '1'], [RoundingMode::DOWN, '1.500', '150', '15', '1'], [RoundingMode::DOWN, '1.499', '149', '14', '1'], [RoundingMode::DOWN, '1.001', '100', '10', '1'], [RoundingMode::DOWN, '1.000', '100', '10', '1'], [RoundingMode::DOWN, '0.999', '99', '9', '0'], [RoundingMode::DOWN, '0.501', '50', '5', '0'], [RoundingMode::DOWN, '0.500', '50', '5', '0'], [RoundingMode::DOWN, '0.499', '49', '4', '0'], [RoundingMode::DOWN, '0.001', '0', '0', '0'], [RoundingMode::DOWN, '0.000', '0', '0', '0'], [RoundingMode::DOWN, '-0.001', '0', '0', '0'], [RoundingMode::DOWN, '-0.499', '-49', '-4', '0'], [RoundingMode::DOWN, '-0.500', '-50', '-5', '0'], [RoundingMode::DOWN, '-0.501', '-50', '-5', '0'], [RoundingMode::DOWN, '-0.999', '-99', '-9', '0'], [RoundingMode::DOWN, '-1.000', '-100', '-10', '-1'], [RoundingMode::DOWN, '-1.001', '-100', '-10', '-1'], [RoundingMode::DOWN, '-1.499', '-149', '-14', '-1'], [RoundingMode::DOWN, '-1.500', '-150', '-15', '-1'], [RoundingMode::DOWN, '-1.501', '-150', '-15', '-1'], [RoundingMode::DOWN, '-1.999', '-199', '-19', '-1'], [RoundingMode::DOWN, '-2.000', '-200', '-20', '-2'], [RoundingMode::DOWN, '-2.001', '-200', '-20', '-2'], [RoundingMode::DOWN, '-2.499', '-249', '-24', '-2'], [RoundingMode::DOWN, '-2.500', '-250', '-25', '-2'], [RoundingMode::DOWN, '-2.501', '-250', '-25', '-2'], [RoundingMode::DOWN, '-2.999', '-299', '-29', '-2'], [RoundingMode::DOWN, '-3.000', '-300', '-30', '-3'], [RoundingMode::DOWN, '-3.001', '-300', '-30', '-3'], [RoundingMode::DOWN, '-3.499', '-349', '-34', '-3'], [RoundingMode::DOWN, '-3.500', '-350', '-35', '-3'], [RoundingMode::DOWN, '-3.501', '-350', '-35', '-3'], [RoundingMode::CEILING, '3.501', '351', '36', '4'], [RoundingMode::CEILING, '3.500', '350', '35', '4'], [RoundingMode::CEILING, '3.499', '350', '35', '4'], [RoundingMode::CEILING, '3.001', '301', '31', '4'], [RoundingMode::CEILING, '3.000', '300', '30', '3'], [RoundingMode::CEILING, '2.999', '300', '30', '3'], [RoundingMode::CEILING, '2.501', '251', '26', '3'], [RoundingMode::CEILING, '2.500', '250', '25', '3'], [RoundingMode::CEILING, '2.499', '250', '25', '3'], [RoundingMode::CEILING, '2.001', '201', '21', '3'], [RoundingMode::CEILING, '2.000', '200', '20', '2'], [RoundingMode::CEILING, '1.999', '200', '20', '2'], [RoundingMode::CEILING, '1.501', '151', '16', '2'], [RoundingMode::CEILING, '1.500', '150', '15', '2'], [RoundingMode::CEILING, '1.499', '150', '15', '2'], [RoundingMode::CEILING, '1.001', '101', '11', '2'], [RoundingMode::CEILING, '1.000', '100', '10', '1'], [RoundingMode::CEILING, '0.999', '100', '10', '1'], [RoundingMode::CEILING, '0.501', '51', '6', '1'], [RoundingMode::CEILING, '0.500', '50', '5', '1'], [RoundingMode::CEILING, '0.499', '50', '5', '1'], [RoundingMode::CEILING, '0.001', '1', '1', '1'], [RoundingMode::CEILING, '0.000', '0', '0', '0'], [RoundingMode::CEILING, '-0.001', '0', '0', '0'], [RoundingMode::CEILING, '-0.499', '-49' , '-4', '0'], [RoundingMode::CEILING, '-0.500', '-50' , '-5', '0'], [RoundingMode::CEILING, '-0.501', '-50', '-5', '0'], [RoundingMode::CEILING, '-0.999', '-99', '-9', '0'], [RoundingMode::CEILING, '-1.000', '-100', '-10', '-1'], [RoundingMode::CEILING, '-1.001', '-100', '-10', '-1'], [RoundingMode::CEILING, '-1.499', '-149', '-14', '-1'], [RoundingMode::CEILING, '-1.500', '-150', '-15', '-1'], [RoundingMode::CEILING, '-1.501', '-150', '-15', '-1'], [RoundingMode::CEILING, '-1.999', '-199', '-19', '-1'], [RoundingMode::CEILING, '-2.000', '-200', '-20', '-2'], [RoundingMode::CEILING, '-2.001', '-200', '-20', '-2'], [RoundingMode::CEILING, '-2.499', '-249', '-24', '-2'], [RoundingMode::CEILING, '-2.500', '-250', '-25', '-2'], [RoundingMode::CEILING, '-2.501', '-250', '-25', '-2'], [RoundingMode::CEILING, '-2.999', '-299', '-29', '-2'], [RoundingMode::CEILING, '-3.000', '-300', '-30', '-3'], [RoundingMode::CEILING, '-3.001', '-300', '-30', '-3'], [RoundingMode::CEILING, '-3.499', '-349', '-34', '-3'], [RoundingMode::CEILING, '-3.500', '-350', '-35', '-3'], [RoundingMode::CEILING, '-3.501', '-350', '-35', '-3'], [RoundingMode::FLOOR, '3.501', '350', '35', '3'], [RoundingMode::FLOOR, '3.500', '350', '35', '3'], [RoundingMode::FLOOR, '3.499', '349', '34', '3'], [RoundingMode::FLOOR, '3.001', '300', '30', '3'], [RoundingMode::FLOOR, '3.000', '300', '30', '3'], [RoundingMode::FLOOR, '2.999', '299', '29', '2'], [RoundingMode::FLOOR, '2.501', '250', '25', '2'], [RoundingMode::FLOOR, '2.500', '250', '25', '2'], [RoundingMode::FLOOR, '2.499', '249', '24', '2'], [RoundingMode::FLOOR, '2.001', '200', '20', '2'], [RoundingMode::FLOOR, '2.000', '200', '20', '2'], [RoundingMode::FLOOR, '1.999', '199', '19', '1'], [RoundingMode::FLOOR, '1.501', '150', '15', '1'], [RoundingMode::FLOOR, '1.500', '150', '15', '1'], [RoundingMode::FLOOR, '1.499', '149', '14', '1'], [RoundingMode::FLOOR, '1.001', '100', '10', '1'], [RoundingMode::FLOOR, '1.000', '100', '10', '1'], [RoundingMode::FLOOR, '0.999', '99', '9', '0'], [RoundingMode::FLOOR, '0.501', '50', '5', '0'], [RoundingMode::FLOOR, '0.500', '50', '5', '0'], [RoundingMode::FLOOR, '0.499', '49', '4', '0'], [RoundingMode::FLOOR, '0.001', '0', '0', '0'], [RoundingMode::FLOOR, '0.000', '0', '0', '0'], [RoundingMode::FLOOR, '-0.001', '-1', '-1', '-1'], [RoundingMode::FLOOR, '-0.499', '-50', '-5', '-1'], [RoundingMode::FLOOR, '-0.500', '-50', '-5', '-1'], [RoundingMode::FLOOR, '-0.501', '-51', '-6', '-1'], [RoundingMode::FLOOR, '-0.999', '-100', '-10', '-1'], [RoundingMode::FLOOR, '-1.000', '-100', '-10', '-1'], [RoundingMode::FLOOR, '-1.001', '-101', '-11', '-2'], [RoundingMode::FLOOR, '-1.499', '-150', '-15', '-2'], [RoundingMode::FLOOR, '-1.500', '-150', '-15', '-2'], [RoundingMode::FLOOR, '-1.501', '-151', '-16', '-2'], [RoundingMode::FLOOR, '-1.999', '-200', '-20', '-2'], [RoundingMode::FLOOR, '-2.000', '-200', '-20', '-2'], [RoundingMode::FLOOR, '-2.001', '-201', '-21', '-3'], [RoundingMode::FLOOR, '-2.499', '-250', '-25', '-3'], [RoundingMode::FLOOR, '-2.500', '-250', '-25', '-3'], [RoundingMode::FLOOR, '-2.501', '-251', '-26', '-3'], [RoundingMode::FLOOR, '-2.999', '-300', '-30', '-3'], [RoundingMode::FLOOR, '-3.000', '-300', '-30', '-3'], [RoundingMode::FLOOR, '-3.001', '-301', '-31', '-4'], [RoundingMode::FLOOR, '-3.499', '-350', '-35', '-4'], [RoundingMode::FLOOR, '-3.500', '-350', '-35', '-4'], [RoundingMode::FLOOR, '-3.501', '-351', '-36', '-4'], [RoundingMode::HALF_UP, '3.501', '350', '35', '4'], [RoundingMode::HALF_UP, '3.500', '350', '35', '4'], [RoundingMode::HALF_UP, '3.499', '350', '35', '3'], [RoundingMode::HALF_UP, '3.001', '300', '30', '3'], [RoundingMode::HALF_UP, '3.000', '300', '30', '3'], [RoundingMode::HALF_UP, '2.999', '300', '30', '3'], [RoundingMode::HALF_UP, '2.501', '250', '25', '3'], [RoundingMode::HALF_UP, '2.500', '250', '25', '3'], [RoundingMode::HALF_UP, '2.499', '250', '25', '2'], [RoundingMode::HALF_UP, '2.001', '200', '20', '2'], [RoundingMode::HALF_UP, '2.000', '200', '20', '2'], [RoundingMode::HALF_UP, '1.999', '200', '20', '2'], [RoundingMode::HALF_UP, '1.501', '150', '15', '2'], [RoundingMode::HALF_UP, '1.500', '150', '15', '2'], [RoundingMode::HALF_UP, '1.499', '150', '15', '1'], [RoundingMode::HALF_UP, '1.001', '100', '10', '1'], [RoundingMode::HALF_UP, '1.000', '100', '10', '1'], [RoundingMode::HALF_UP, '0.999', '100', '10', '1'], [RoundingMode::HALF_UP, '0.501', '50', '5', '1'], [RoundingMode::HALF_UP, '0.500', '50', '5', '1'], [RoundingMode::HALF_UP, '0.499', '50', '5', '0'], [RoundingMode::HALF_UP, '0.001', '0', '0', '0'], [RoundingMode::HALF_UP, '0.000', '0', '0', '0'], [RoundingMode::HALF_UP, '-0.001', '0', '0', '0'], [RoundingMode::HALF_UP, '-0.499', '-50', '-5', '0'], [RoundingMode::HALF_UP, '-0.500', '-50', '-5', '-1'], [RoundingMode::HALF_UP, '-0.501', '-50', '-5', '-1'], [RoundingMode::HALF_UP, '-0.999', '-100', '-10', '-1'], [RoundingMode::HALF_UP, '-1.000', '-100', '-10', '-1'], [RoundingMode::HALF_UP, '-1.001', '-100', '-10', '-1'], [RoundingMode::HALF_UP, '-1.499', '-150', '-15', '-1'], [RoundingMode::HALF_UP, '-1.500', '-150', '-15', '-2'], [RoundingMode::HALF_UP, '-1.501', '-150', '-15', '-2'], [RoundingMode::HALF_UP, '-1.999', '-200', '-20', '-2'], [RoundingMode::HALF_UP, '-2.000', '-200', '-20', '-2'], [RoundingMode::HALF_UP, '-2.001', '-200', '-20', '-2'], [RoundingMode::HALF_UP, '-2.499', '-250', '-25', '-2'], [RoundingMode::HALF_UP, '-2.500', '-250', '-25', '-3'], [RoundingMode::HALF_UP, '-2.501', '-250', '-25', '-3'], [RoundingMode::HALF_UP, '-2.999', '-300', '-30', '-3'], [RoundingMode::HALF_UP, '-3.000', '-300', '-30', '-3'], [RoundingMode::HALF_UP, '-3.001', '-300', '-30', '-3'], [RoundingMode::HALF_UP, '-3.499', '-350', '-35', '-3'], [RoundingMode::HALF_UP, '-3.500', '-350', '-35', '-4'], [RoundingMode::HALF_UP, '-3.501', '-350', '-35', '-4'], [RoundingMode::HALF_DOWN, '3.501', '350', '35', '4'], [RoundingMode::HALF_DOWN, '3.500', '350', '35', '3'], [RoundingMode::HALF_DOWN, '3.499', '350', '35', '3'], [RoundingMode::HALF_DOWN, '3.001', '300', '30', '3'], [RoundingMode::HALF_DOWN, '3.000', '300', '30', '3'], [RoundingMode::HALF_DOWN, '2.999', '300', '30', '3'], [RoundingMode::HALF_DOWN, '2.501', '250', '25', '3'], [RoundingMode::HALF_DOWN, '2.500', '250', '25', '2'], [RoundingMode::HALF_DOWN, '2.499', '250', '25', '2'], [RoundingMode::HALF_DOWN, '2.001', '200', '20', '2'], [RoundingMode::HALF_DOWN, '2.000', '200', '20', '2'], [RoundingMode::HALF_DOWN, '1.999', '200', '20', '2'], [RoundingMode::HALF_DOWN, '1.501', '150', '15', '2'], [RoundingMode::HALF_DOWN, '1.500', '150', '15', '1'], [RoundingMode::HALF_DOWN, '1.499', '150', '15', '1'], [RoundingMode::HALF_DOWN, '1.001', '100', '10', '1'], [RoundingMode::HALF_DOWN, '1.000', '100', '10', '1'], [RoundingMode::HALF_DOWN, '0.999', '100', '10', '1'], [RoundingMode::HALF_DOWN, '0.501', '50', '5', '1'], [RoundingMode::HALF_DOWN, '0.500', '50', '5', '0'], [RoundingMode::HALF_DOWN, '0.499', '50', '5', '0'], [RoundingMode::HALF_DOWN, '0.001', '0', '0', '0'], [RoundingMode::HALF_DOWN, '0.000', '0', '0', '0'], [RoundingMode::HALF_DOWN, '-0.001', '0', '0', '0'], [RoundingMode::HALF_DOWN, '-0.499', '-50', '-5', '0'], [RoundingMode::HALF_DOWN, '-0.500', '-50', '-5', '0'], [RoundingMode::HALF_DOWN, '-0.501', '-50', '-5', '-1'], [RoundingMode::HALF_DOWN, '-0.999', '-100', '-10', '-1'], [RoundingMode::HALF_DOWN, '-1.000', '-100', '-10', '-1'], [RoundingMode::HALF_DOWN, '-1.001', '-100', '-10', '-1'], [RoundingMode::HALF_DOWN, '-1.499', '-150', '-15', '-1'], [RoundingMode::HALF_DOWN, '-1.500', '-150', '-15', '-1'], [RoundingMode::HALF_DOWN, '-1.501', '-150', '-15', '-2'], [RoundingMode::HALF_DOWN, '-1.999', '-200', '-20', '-2'], [RoundingMode::HALF_DOWN, '-2.000', '-200', '-20', '-2'], [RoundingMode::HALF_DOWN, '-2.001', '-200', '-20', '-2'], [RoundingMode::HALF_DOWN, '-2.499', '-250', '-25', '-2'], [RoundingMode::HALF_DOWN, '-2.500', '-250', '-25', '-2'], [RoundingMode::HALF_DOWN, '-2.501', '-250', '-25', '-3'], [RoundingMode::HALF_DOWN, '-2.999', '-300', '-30', '-3'], [RoundingMode::HALF_DOWN, '-3.000', '-300', '-30', '-3'], [RoundingMode::HALF_DOWN, '-3.001', '-300', '-30', '-3'], [RoundingMode::HALF_DOWN, '-3.499', '-350', '-35', '-3'], [RoundingMode::HALF_DOWN, '-3.500', '-350', '-35', '-3'], [RoundingMode::HALF_DOWN, '-3.501', '-350', '-35', '-4'], [RoundingMode::HALF_CEILING, '3.501', '350', '35', '4'], [RoundingMode::HALF_CEILING, '3.500', '350', '35', '4'], [RoundingMode::HALF_CEILING, '3.499', '350', '35', '3'], [RoundingMode::HALF_CEILING, '3.001', '300', '30', '3'], [RoundingMode::HALF_CEILING, '3.000', '300', '30', '3'], [RoundingMode::HALF_CEILING, '2.999', '300', '30', '3'], [RoundingMode::HALF_CEILING, '2.501', '250', '25', '3'], [RoundingMode::HALF_CEILING, '2.500', '250', '25', '3'], [RoundingMode::HALF_CEILING, '2.499', '250', '25', '2'], [RoundingMode::HALF_CEILING, '2.001', '200', '20', '2'], [RoundingMode::HALF_CEILING, '2.000', '200', '20', '2'], [RoundingMode::HALF_CEILING, '1.999', '200', '20', '2'], [RoundingMode::HALF_CEILING, '1.501', '150', '15', '2'], [RoundingMode::HALF_CEILING, '1.500', '150', '15', '2'], [RoundingMode::HALF_CEILING, '1.499', '150', '15', '1'], [RoundingMode::HALF_CEILING, '1.001', '100', '10', '1'], [RoundingMode::HALF_CEILING, '1.000', '100', '10', '1'], [RoundingMode::HALF_CEILING, '0.999', '100', '10', '1'], [RoundingMode::HALF_CEILING, '0.501', '50', '5', '1'], [RoundingMode::HALF_CEILING, '0.500', '50', '5', '1'], [RoundingMode::HALF_CEILING, '0.499', '50', '5', '0'], [RoundingMode::HALF_CEILING, '0.001', '0', '0', '0'], [RoundingMode::HALF_CEILING, '0.000', '0', '0', '0'], [RoundingMode::HALF_CEILING, '-0.001', '0', '0', '0'], [RoundingMode::HALF_CEILING, '-0.499', '-50', '-5', '0'], [RoundingMode::HALF_CEILING, '-0.500', '-50', '-5', '0'], [RoundingMode::HALF_CEILING, '-0.501', '-50', '-5', '-1'], [RoundingMode::HALF_CEILING, '-0.999', '-100', '-10', '-1'], [RoundingMode::HALF_CEILING, '-1.000', '-100', '-10', '-1'], [RoundingMode::HALF_CEILING, '-1.001', '-100', '-10', '-1'], [RoundingMode::HALF_CEILING, '-1.499', '-150', '-15', '-1'], [RoundingMode::HALF_CEILING, '-1.500', '-150', '-15', '-1'], [RoundingMode::HALF_CEILING, '-1.501', '-150', '-15', '-2'], [RoundingMode::HALF_CEILING, '-1.999', '-200', '-20', '-2'], [RoundingMode::HALF_CEILING, '-2.000', '-200', '-20', '-2'], [RoundingMode::HALF_CEILING, '-2.001', '-200', '-20', '-2'], [RoundingMode::HALF_CEILING, '-2.499', '-250', '-25', '-2'], [RoundingMode::HALF_CEILING, '-2.500', '-250', '-25', '-2'], [RoundingMode::HALF_CEILING, '-2.501', '-250', '-25', '-3'], [RoundingMode::HALF_CEILING, '-2.999', '-300', '-30', '-3'], [RoundingMode::HALF_CEILING, '-3.000', '-300', '-30', '-3'], [RoundingMode::HALF_CEILING, '-3.001', '-300', '-30', '-3'], [RoundingMode::HALF_CEILING, '-3.499', '-350', '-35', '-3'], [RoundingMode::HALF_CEILING, '-3.500', '-350', '-35', '-3'], [RoundingMode::HALF_CEILING, '-3.501', '-350', '-35', '-4'], [RoundingMode::HALF_FLOOR, '3.501', '350', '35', '4'], [RoundingMode::HALF_FLOOR, '3.500', '350', '35', '3'], [RoundingMode::HALF_FLOOR, '3.499', '350', '35', '3'], [RoundingMode::HALF_FLOOR, '3.001', '300', '30', '3'], [RoundingMode::HALF_FLOOR, '3.000', '300', '30', '3'], [RoundingMode::HALF_FLOOR, '2.999', '300', '30', '3'], [RoundingMode::HALF_FLOOR, '2.501', '250', '25', '3'], [RoundingMode::HALF_FLOOR, '2.500', '250', '25', '2'], [RoundingMode::HALF_FLOOR, '2.499', '250', '25', '2'], [RoundingMode::HALF_FLOOR, '2.001', '200', '20', '2'], [RoundingMode::HALF_FLOOR, '2.000', '200', '20', '2'], [RoundingMode::HALF_FLOOR, '1.999', '200', '20', '2'], [RoundingMode::HALF_FLOOR, '1.501', '150', '15', '2'], [RoundingMode::HALF_FLOOR, '1.500', '150', '15', '1'], [RoundingMode::HALF_FLOOR, '1.499', '150', '15', '1'], [RoundingMode::HALF_FLOOR, '1.001', '100', '10', '1'], [RoundingMode::HALF_FLOOR, '1.000', '100', '10', '1'], [RoundingMode::HALF_FLOOR, '0.999', '100', '10', '1'], [RoundingMode::HALF_FLOOR, '0.501', '50', '5', '1'], [RoundingMode::HALF_FLOOR, '0.500', '50', '5', '0'], [RoundingMode::HALF_FLOOR, '0.499', '50', '5', '0'], [RoundingMode::HALF_FLOOR, '0.001', '0', '0', '0'], [RoundingMode::HALF_FLOOR, '0.000', '0', '0', '0'], [RoundingMode::HALF_FLOOR, '-0.001', '0', '0', '0'], [RoundingMode::HALF_FLOOR, '-0.499', '-50', '-5', '0'], [RoundingMode::HALF_FLOOR, '-0.500', '-50', '-5', '-1'], [RoundingMode::HALF_FLOOR, '-0.501', '-50', '-5', '-1'], [RoundingMode::HALF_FLOOR, '-0.999', '-100', '-10', '-1'], [RoundingMode::HALF_FLOOR, '-1.000', '-100', '-10', '-1'], [RoundingMode::HALF_FLOOR, '-1.001', '-100', '-10', '-1'], [RoundingMode::HALF_FLOOR, '-1.499', '-150', '-15', '-1'], [RoundingMode::HALF_FLOOR, '-1.500', '-150', '-15', '-2'], [RoundingMode::HALF_FLOOR, '-1.501', '-150', '-15', '-2'], [RoundingMode::HALF_FLOOR, '-1.999', '-200', '-20', '-2'], [RoundingMode::HALF_FLOOR, '-2.000', '-200', '-20', '-2'], [RoundingMode::HALF_FLOOR, '-2.001', '-200', '-20', '-2'], [RoundingMode::HALF_FLOOR, '-2.499', '-250', '-25', '-2'], [RoundingMode::HALF_FLOOR, '-2.500', '-250', '-25', '-3'], [RoundingMode::HALF_FLOOR, '-2.501', '-250', '-25', '-3'], [RoundingMode::HALF_FLOOR, '-2.999', '-300', '-30', '-3'], [RoundingMode::HALF_FLOOR, '-3.000', '-300', '-30', '-3'], [RoundingMode::HALF_FLOOR, '-3.001', '-300', '-30', '-3'], [RoundingMode::HALF_FLOOR, '-3.499', '-350', '-35', '-3'], [RoundingMode::HALF_FLOOR, '-3.500', '-350', '-35', '-4'], [RoundingMode::HALF_FLOOR, '-3.501', '-350', '-35', '-4'], [RoundingMode::HALF_EVEN, '3.501', '350', '35', '4'], [RoundingMode::HALF_EVEN, '3.500', '350', '35', '4'], [RoundingMode::HALF_EVEN, '3.499', '350', '35', '3'], [RoundingMode::HALF_EVEN, '3.001', '300', '30', '3'], [RoundingMode::HALF_EVEN, '3.000', '300', '30', '3'], [RoundingMode::HALF_EVEN, '2.999', '300', '30', '3'], [RoundingMode::HALF_EVEN, '2.501', '250', '25', '3'], [RoundingMode::HALF_EVEN, '2.500', '250', '25', '2'], [RoundingMode::HALF_EVEN, '2.499', '250', '25', '2'], [RoundingMode::HALF_EVEN, '2.001', '200', '20', '2'], [RoundingMode::HALF_EVEN, '2.000', '200', '20', '2'], [RoundingMode::HALF_EVEN, '1.999', '200', '20', '2'], [RoundingMode::HALF_EVEN, '1.501', '150', '15', '2'], [RoundingMode::HALF_EVEN, '1.500', '150', '15', '2'], [RoundingMode::HALF_EVEN, '1.499', '150', '15', '1'], [RoundingMode::HALF_EVEN, '1.001', '100', '10', '1'], [RoundingMode::HALF_EVEN, '1.000', '100', '10', '1'], [RoundingMode::HALF_EVEN, '0.999', '100', '10', '1'], [RoundingMode::HALF_EVEN, '0.501', '50', '5', '1'], [RoundingMode::HALF_EVEN, '0.500', '50', '5', '0'], [RoundingMode::HALF_EVEN, '0.499', '50', '5', '0'], [RoundingMode::HALF_EVEN, '0.001', '0', '0', '0'], [RoundingMode::HALF_EVEN, '0.000', '0', '0', '0'], [RoundingMode::HALF_EVEN, '-0.001', '0', '0', '0'], [RoundingMode::HALF_EVEN, '-0.499', '-50', '-5', '0'], [RoundingMode::HALF_EVEN, '-0.500', '-50', '-5', '0'], [RoundingMode::HALF_EVEN, '-0.501', '-50', '-5', '-1'], [RoundingMode::HALF_EVEN, '-0.999', '-100', '-10', '-1'], [RoundingMode::HALF_EVEN, '-1.000', '-100', '-10', '-1'], [RoundingMode::HALF_EVEN, '-1.001', '-100', '-10', '-1'], [RoundingMode::HALF_EVEN, '-1.499', '-150', '-15', '-1'], [RoundingMode::HALF_EVEN, '-1.500', '-150', '-15', '-2'], [RoundingMode::HALF_EVEN, '-1.501', '-150', '-15', '-2'], [RoundingMode::HALF_EVEN, '-1.999', '-200', '-20', '-2'], [RoundingMode::HALF_EVEN, '-2.000', '-200', '-20', '-2'], [RoundingMode::HALF_EVEN, '-2.001', '-200', '-20', '-2'], [RoundingMode::HALF_EVEN, '-2.499', '-250', '-25', '-2'], [RoundingMode::HALF_EVEN, '-2.500', '-250', '-25', '-2'], [RoundingMode::HALF_EVEN, '-2.501', '-250', '-25', '-3'], [RoundingMode::HALF_EVEN, '-2.999', '-300', '-30', '-3'], [RoundingMode::HALF_EVEN, '-3.000', '-300', '-30', '-3'], [RoundingMode::HALF_EVEN, '-3.001', '-300', '-30', '-3'], [RoundingMode::HALF_EVEN, '-3.499', '-350', '-35', '-3'], [RoundingMode::HALF_EVEN, '-3.500', '-350', '-35', '-4'], [RoundingMode::HALF_EVEN, '-3.501', '-350', '-35', '-4'], [RoundingMode::UNNECESSARY, '3.501', null, null, null], [RoundingMode::UNNECESSARY, '3.500', '350', '35', null], [RoundingMode::UNNECESSARY, '3.499', null, null, null], [RoundingMode::UNNECESSARY, '3.001', null, null, null], [RoundingMode::UNNECESSARY, '3.000', '300', '30', '3'], [RoundingMode::UNNECESSARY, '2.999', null, null, null], [RoundingMode::UNNECESSARY, '2.501', null, null, null], [RoundingMode::UNNECESSARY, '2.500', '250', '25', null], [RoundingMode::UNNECESSARY, '2.499', null, null, null], [RoundingMode::UNNECESSARY, '2.001', null, null, null], [RoundingMode::UNNECESSARY, '2.000', '200', '20', '2'], [RoundingMode::UNNECESSARY, '1.999', null, null, null], [RoundingMode::UNNECESSARY, '1.501', null, null, null], [RoundingMode::UNNECESSARY, '1.500', '150', '15', null], [RoundingMode::UNNECESSARY, '1.499', null, null, null], [RoundingMode::UNNECESSARY, '1.001', null, null, null], [RoundingMode::UNNECESSARY, '1.000', '100', '10', '1'], [RoundingMode::UNNECESSARY, '0.999', null, null, null], [RoundingMode::UNNECESSARY, '0.501', null, null, null], [RoundingMode::UNNECESSARY, '0.500', '50', '5', null], [RoundingMode::UNNECESSARY, '0.499', null, null, null], [RoundingMode::UNNECESSARY, '0.001', null, null, null], [RoundingMode::UNNECESSARY, '0.000', '0', '0', '0'], [RoundingMode::UNNECESSARY, '-0.001', null, null, null], [RoundingMode::UNNECESSARY, '-0.499', null, null, null], [RoundingMode::UNNECESSARY, '-0.500', '-50', '-5', null], [RoundingMode::UNNECESSARY, '-0.501', null, null, null], [RoundingMode::UNNECESSARY, '-0.999', null, null, null], [RoundingMode::UNNECESSARY, '-1.000', '-100', '-10', '-1'], [RoundingMode::UNNECESSARY, '-1.001', null, null, null], [RoundingMode::UNNECESSARY, '-1.499', null, null, null], [RoundingMode::UNNECESSARY, '-1.500', '-150', '-15', null], [RoundingMode::UNNECESSARY, '-1.501', null, null, null], [RoundingMode::UNNECESSARY, '-1.999', null, null, null], [RoundingMode::UNNECESSARY, '-2.000', '-200', '-20', '-2'], [RoundingMode::UNNECESSARY, '-2.001', null, null, null], [RoundingMode::UNNECESSARY, '-2.499', null, null, null], [RoundingMode::UNNECESSARY, '-2.500', '-250', '-25', null], [RoundingMode::UNNECESSARY, '-2.501', null, null, null], [RoundingMode::UNNECESSARY, '-2.999', null, null, null], [RoundingMode::UNNECESSARY, '-3.000', '-300', '-30', '-3'], [RoundingMode::UNNECESSARY, '-3.001', null, null, null], [RoundingMode::UNNECESSARY, '-3.499', null, null, null], [RoundingMode::UNNECESSARY, '-3.500', '-350', '-35', null], [RoundingMode::UNNECESSARY, '-3.501', null, null, null], ]; } /** * @dataProvider providerDivideAndRemainder * * @param string $dividend The dividend. * @param string $divisor The divisor. * @param string $quotient The expected quotient. * @param string $remainder The expected remainder. */ public function testDivideAndRemainder($dividend, $divisor, $quotient, $remainder) { list ($q, $r) = BigDecimal::of($dividend)->divideAndRemainder($divisor); $this->assertSame($quotient, (string) $q); $this->assertSame($remainder, (string) $r); } /** * @return array */ public function providerDivideAndRemainder() { return [ ['1', '123', '0', '1'], ['1', '-123', '0', '1'], ['-1', '123', '0', '-1'], ['-1', '-123', '0', '-1'], ['1999999999999999999999999', '2000000000000000000000000', '0', '1999999999999999999999999'], ['1999999999999999999999999', '-2000000000000000000000000', '0', '1999999999999999999999999'], ['-1999999999999999999999999', '2000000000000000000000000', '0', '-1999999999999999999999999'], ['-1999999999999999999999999', '-2000000000000000000000000', '0', '-1999999999999999999999999'], ['123', '1', '123', '0'], ['123', '-1', '-123', '0'], ['-123', '1', '-123', '0'], ['-123', '-1', '123', '0'], ['123', '2', '61', '1'], ['123', '-2', '-61', '1'], ['-123', '2', '-61', '-1'], ['-123', '-2', '61', '-1'], ['123', '123', '1', '0'], ['123', '-123', '-1', '0'], ['-123', '123', '-1', '0'], ['-123', '-123', '1', '0'], ['123', '124', '0', '123'], ['123', '-124', '0', '123'], ['-123', '124', '0', '-123'], ['-123', '-124', '0', '-123'], ['124', '123', '1', '1'], ['124', '-123', '-1', '1'], ['-124', '123', '-1', '-1'], ['-124', '-123', '1', '-1'], ['1000000000000000000000000000000', '3', '333333333333333333333333333333', '1'], ['1000000000000000000000000000000', '9', '111111111111111111111111111111', '1'], ['1000000000000000000000000000000', '11', '90909090909090909090909090909', '1'], ['1000000000000000000000000000000', '13', '76923076923076923076923076923', '1'], ['1000000000000000000000000000000', '21', '47619047619047619047619047619', '1'], ['123456789123456789123456789', '987654321987654321', '124999998', '850308642973765431'], ['123456789123456789123456789', '-87654321987654321', '-1408450676', '65623397056685793'], ['-123456789123456789123456789', '7654321987654321', '-16129030020', '-1834176331740369'], ['-123456789123456789123456789', '-654321987654321', '188678955396', '-205094497790673'], ['10.11', '3.3', '3', '0.21'], ['1', '-0.0013', '-769', '0.0003'], ['-1.000000000000000000001', '0.0000009298439898981609', '-1075449', '-0.0000002109080127582569'], ['-1278438782896060000132323.32333', '-53.4836775545640521556878910541', '23903344746475158719036', '-30.0786684482104867175202241524'], ['23999593472872987498347103908209387429846376', '-0.005', '-4799918694574597499669420781641877485969275200', '0.000'], ['1000000000000000000000000000000.0', '3', '333333333333333333333333333333', '1.0'], ['1000000000000000000000000000000.0', '9', '111111111111111111111111111111', '1.0'], ['1000000000000000000000000000000.0', '11', '90909090909090909090909090909', '1.0'], ['1000000000000000000000000000000.0', '13', '76923076923076923076923076923', '1.0'], ['0.9999999999999999999999999999999', '0.21', '4', '0.1599999999999999999999999999999'], ['1000000000000000000000000000000.0', '3.9', '256410256410256410256410256410', '1.0'], ['-1000000000000000000000000000000.0', '9.8', '-102040816326530612244897959183', '-6.6'], ['1000000000000000000000000000000.0', '-11.7', '-85470085470085470085470085470', '1.0'], ['-1000000000000000000000000000000.0', '-13.7', '72992700729927007299270072992', '-9.6'], ['0.99999999999999999999999999999999', '0.215', '4', '0.13999999999999999999999999999999'], ]; } /** * @expectedException \Brick\Math\Exception\DivisionByZeroException */ public function testDivideAndRemainderByZeroThrowsException() { BigDecimal::of(1.2)->divideAndRemainder(0); } /** * @dataProvider providerPower * * @param string $number The base number. * @param int $exponent The exponent to apply. * @param string $unscaledValue The expected unscaled value of the result. * @param int $scale The expected scale of the result. */ public function testPower($number, $exponent, $unscaledValue, $scale) { $this->assertBigDecimalEquals($unscaledValue, $scale, BigDecimal::of($number)->power($exponent)); } /** * @return array */ public function providerPower() { return [ ['-3', 0, '1', 0], ['-2', 0, '1', 0], ['-1', 0, '1', 0], ['0', 0, '1', 0], ['1', 0, '1', 0], ['2', 0, '1', 0], ['3', 0, '1', 0], ['-3', 1, '-3', 0], ['-2', 1, '-2', 0], ['-1', 1, '-1', 0], ['0', 1, '0', 0], ['1', 1, '1', 0], ['2', 1, '2', 0], ['3', 1, '3', 0], ['-3', 2, '9', 0], ['-2', 2, '4', 0], ['-1', 2, '1', 0], ['0', 2, '0', 0], ['1', 2, '1', 0], ['2', 2, '4', 0], ['3', 2, '9', 0], ['-3', 3, '-27', 0], ['-2', 3, '-8', 0], ['-1', 3, '-1', 0], ['0', 3, '0', 0], ['1', 3, '1', 0], ['2', 3, '8', 0], ['3', 3, '27', 0], ['0', 1000000, '0', 0], ['1', 1000000, '1', 0], ['-2', 255, '-57896044618658097711785492504343953926634992332820282019728792003956564819968', 0], [ '2', 256, '115792089237316195423570985008687907853269984665640564039457584007913129639936', 0], ['-1.23', 33, '-926549609804623448265268294182900512918058893428212027689876489708283', 66], [ '1.23', 34, '113965602005968684136628000184496763088921243891670079405854808234118809', 68], ['-123456789', 8, '53965948844821664748141453212125737955899777414752273389058576481', 0], ['9876543210', 7, '9167159269868350921847491739460569765344716959834325922131706410000000', 0] ]; } /** * @dataProvider providerPowerWithInvalidExponentThrowsException * @expectedException \InvalidArgumentException * * @param int $power */ public function testPowerWithInvalidExponentThrowsException($power) { BigDecimal::of(1)->power($power); } /** * @return array */ public function providerPowerWithInvalidExponentThrowsException() { return [ [-1], [1000001] ]; } /** * @dataProvider withScaleProvider * * @param string $number The number to scale. * @param int $withScale The scale to apply. * @param int $roundingMode The rounding mode to apply. * @param string $unscaledValue The expected unscaled value of the result. * @param int $scale The expected scale of the result. */ public function testWithScale($number, $withScale, $roundingMode, $unscaledValue, $scale) { $decimal = BigDecimal::of($number)->withScale($withScale, $roundingMode); $this->assertBigDecimalEquals($unscaledValue, $scale, $decimal); } /** * @return array */ public function withScaleProvider() { return [ ['123.45', 0, RoundingMode::DOWN, '123', 0], ['123.45', 1, RoundingMode::UP, '1235', 1], ['123.45', 2, RoundingMode::UNNECESSARY, '12345', 2], ['123.45', 5, RoundingMode::UNNECESSARY, '12345000', 5] ]; } /** * @dataProvider providerWithPointMovedLeft * * @param string $number The decimal number as a string. * @param int $places The number of decimal places to move left. * @param string $expected The expected result. */ public function testWithPointMovedLeft($number, $places, $expected) { $this->assertSame($expected, (string) BigDecimal::of($number)->withPointMovedLeft($places)); } /** * @return array */ public function providerWithPointMovedLeft() { return [ ['0', -2, '0'], ['0', -1, '0'], ['0', 0, '0'], ['0', 1, '0.0'], ['0', 2, '0.00'], ['0.0', -2, '0'], ['0.0', -1, '0'], ['0.0', 0, '0.0'], ['0.0', 1, '0.00'], ['0.0', 2, '0.000'], ['1', -2, '100'], ['1', -1, '10'], ['1', 0, '1'], ['1', 1, '0.1'], ['1', 2, '0.01'], ['12', -2, '1200'], ['12', -1, '120'], ['12', 0, '12'], ['12', 1, '1.2'], ['12', 2, '0.12'], ['1.1', -2, '110'], ['1.1', -1, '11'], ['1.1', 0, '1.1'], ['1.1', 1, '0.11'], ['1.1', 2, '0.011'], ['0.1', -2, '10'], ['0.1', -1, '1'], ['0.1', 0, '0.1'], ['0.1', 1, '0.01'], ['0.1', 2, '0.001'], ['0.01', -2, '1'], ['0.01', -1, '0.1'], ['0.01', 0, '0.01'], ['0.01', 1, '0.001'], ['0.01', 2, '0.0001'], ['-9', -2, '-900'], ['-9', -1, '-90'], ['-9', 0, '-9'], ['-9', 1, '-0.9'], ['-9', 2, '-0.09'], ['-0.9', -2, '-90'], ['-0.9', -1, '-9'], ['-0.9', 0, '-0.9'], ['-0.9', 1, '-0.09'], ['-0.9', 2, '-0.009'], ['-0.09', -2, '-9'], ['-0.09', -1, '-0.9'], ['-0.09', 0, '-0.09'], ['-0.09', 1, '-0.009'], ['-0.09', 2, '-0.0009'], ['-12.3', -2, '-1230'], ['-12.3', -1, '-123'], ['-12.3', 0, '-12.3'], ['-12.3', 1, '-1.23'], ['-12.3', 2, '-0.123'], ]; } /** * @dataProvider providerWithPointMovedRight * * @param string $number The decimal number as a string. * @param int $places The number of decimal places to move right. * @param string $expected The expected result. */ public function testWithPointMovedRight($number, $places, $expected) { $this->assertSame($expected, (string) BigDecimal::of($number)->withPointMovedRight($places)); } /** * @return array */ public function providerWithPointMovedRight() { return [ ['0', -2, '0.00'], ['0', -1, '0.0'], ['0', 0, '0'], ['0', 1, '0'], ['0', 2, '0'], ['0.0', -2, '0.000'], ['0.0', -1, '0.00'], ['0.0', 0, '0.0'], ['0.0', 1, '0'], ['0.0', 2, '0'], ['9', -2, '0.09'], ['9', -1, '0.9'], ['9', 0, '9'], ['9', 1, '90'], ['9', 2, '900'], ['89', -2, '0.89'], ['89', -1, '8.9'], ['89', 0, '89'], ['89', 1, '890'], ['89', 2, '8900'], ['8.9', -2, '0.089'], ['8.9', -1, '0.89'], ['8.9', 0, '8.9'], ['8.9', 1, '89'], ['8.9', 2, '890'], ['0.9', -2, '0.009'], ['0.9', -1, '0.09'], ['0.9', 0, '0.9'], ['0.9', 1, '9'], ['0.9', 2, '90'], ['0.09', -2, '0.0009'], ['0.09', -1, '0.009'], ['0.09', 0, '0.09'], ['0.09', 1, '0.9'], ['0.09', 2, '9'], ['-1', -2, '-0.01'], ['-1', -1, '-0.1'], ['-1', 0, '-1'], ['-1', 1, '-10'], ['-1', 2, '-100'], ['-0.1', -2, '-0.001'], ['-0.1', -1, '-0.01'], ['-0.1', 0, '-0.1'], ['-0.1', 1, '-1'], ['-0.1', 2, '-10'], ['-0.01', -2, '-0.0001'], ['-0.01', -1, '-0.001'], ['-0.01', 0, '-0.01'], ['-0.01', 1, '-0.1'], ['-0.01', 2, '-1'], ['-12.3', -2, '-0.123'], ['-12.3', -1, '-1.23'], ['-12.3', 0, '-12.3'], ['-12.3', 1, '-123'], ['-12.3', 2, '-1230'], ]; } /** * @dataProvider providerStripTrailingZeros * * @param string $number The number to trim. * @param string $expected The expected result. */ public function testStripTrailingZeros($number, $expected) { $actual = BigDecimal::of($number)->stripTrailingZeros(); $this->assertSame($expected, (string) $actual); } /** * @return array */ public function providerStripTrailingZeros() { return [ ['0', '0'], ['0.0', '0'], ['0.00', '0'], ['0.000', '0'], ['0.1', '0.1'], ['0.01', '0.01'], ['0.001', '0.001'], ['0.100', '0.1'], ['0.0100', '0.01'], ['0.00100', '0.001'], ['1', '1'], ['1.0', '1'], ['1.00', '1'], ['1.10', '1.1'], ['1.123000', '1.123'], ['10', '10'], ['10.0', '10'], ['10.00', '10'], ['10.10', '10.1'], ['10.01', '10.01'], ['10.010', '10.01'], ['100', '100'], ['100.0', '100'], ['100.00', '100'], ['100.01', '100.01'], ['100.10', '100.1'], ['100.010', '100.01'], ['100.100', '100.1'], ]; } /** * @dataProvider providerAbs * * @param string $number The number as a string. * @param string $unscaledValue The expected unscaled value of the absolute result. * @param int $scale The expected scale of the absolute result. */ public function testAbs($number, $unscaledValue, $scale) { $this->assertBigDecimalEquals($unscaledValue, $scale, BigDecimal::of($number)->abs()); } /** * @return array */ public function providerAbs() { return [ ['123', '123', 0], ['-123', '123', 0], ['123.456', '123456', 3], ['-123.456', '123456', 3] ]; } /** * @dataProvider providerNegated * * @param string $number The number to negate as a string. * @param string $unscaledValue The expected unscaled value of the result. * @param int $scale The expected scale of the result. */ public function testNegated($number, $unscaledValue, $scale) { $this->assertBigDecimalEquals($unscaledValue, $scale, BigDecimal::of($number)->negated()); } /** * @return array */ public function providerNegated() { return [ ['123', '-123', 0], ['-123', '123', 0], ['123.456', '-123456', 3], ['-123.456', '123456', 3] ]; } /** * @dataProvider providerCompareTo * * @param string $a The base number as a string. * @param string $b The number to compare to as a string. * @param int $c The expected comparison result. */ public function testCompareTo($a, $b, $c) { $this->assertSame($c, BigDecimal::of($a)->compareTo($b)); } /** * @dataProvider providerCompareTo * * @param string $a The base number as a string. * @param string $b The number to compare to as a string. * @param int $c The comparison result. */ public function testIsEqualTo($a, $b, $c) { $this->assertSame($c == 0, BigDecimal::of($a)->isEqualTo($b)); } /** * @dataProvider providerCompareTo * * @param string $a The base number as a string. * @param string $b The number to compare to as a string. * @param int $c The comparison result. */ public function testIsLessThan($a, $b, $c) { $this->assertSame($c < 0, BigDecimal::of($a)->isLessThan($b)); } /** * @dataProvider providerCompareTo * * @param string $a The base number as a string. * @param string $b The number to compare to as a string. * @param int $c The comparison result. */ public function testIsLessThanOrEqualTo($a, $b, $c) { $this->assertSame($c <= 0, BigDecimal::of($a)->isLessThanOrEqualTo($b)); } /** * @dataProvider providerCompareTo * * @param string $a The base number as a string. * @param string $b The number to compare to as a string. * @param int $c The comparison result. */ public function testIsGreaterThan($a, $b, $c) { $this->assertSame($c > 0, BigDecimal::of($a)->isGreaterThan($b)); } /** * @dataProvider providerCompareTo * * @param string $a The base number as a string. * @param string $b The number to compare to as a string. * @param int $c The comparison result. */ public function testIsGreaterThanOrEqualTo($a, $b, $c) { $this->assertSame($c >= 0, BigDecimal::of($a)->isGreaterThanOrEqualTo($b)); } /** * @return array */ public function providerCompareTo() { return [ ['123', '123', 0], ['123', '456', -1], ['456', '123', 1], ['456', '456', 0], ['-123', '-123', 0], ['-123', '456', -1], [ '456', '-123', 1], [ '456', '456', 0], [ '123', '123', 0], [ '123', '-456', 1], ['-456', '123', -1], ['-456', '456', -1], ['-123', '-123', 0], ['-123', '-456', 1], ['-456', '-123', -1], ['-456', '-456', 0], ['123.000000000000000000000000000000000000000000000', '123', 0], ['123.000000000000000000000000000000000000000000001', '123', 1], ['122.999999999999999999999999999999999999999999999', '123', -1], ['123.0', '123.000000000000000000000000000000000000000000000', 0], ['123.0', '123.000000000000000000000000000000000000000000001', -1], ['123.0', '122.999999999999999999999999999999999999999999999', 1], ['-0.000000000000000000000000000000000000000000000000001', '0', -1], [ '0.000000000000000000000000000000000000000000000000001', '0', 1], [ '0.000000000000000000000000000000000000000000000000000', '0', 0], ['0', '-0.000000000000000000000000000000000000000000000000001', 1], ['0', '0.000000000000000000000000000000000000000000000000001', -1], ['0', '0.000000000000000000000000000000000000000000000000000', 0] ]; } /** * @dataProvider providerSign * * @param number|string $number The number to test. * @param int $sign The sign of the number. */ public function testGetSign($number, $sign) { $this->assertSame($sign, BigDecimal::of($number)->getSign()); } /** * @dataProvider providerSign * * @param number|string $number The number to test. * @param int $sign The sign of the number. */ public function testIsZero($number, $sign) { $this->assertSame($sign === 0, BigDecimal::of($number)->isZero()); } /** * @dataProvider providerSign * * @param number|string $number The number to test. * @param int $sign The sign of the number. */ public function testIsNegative($number, $sign) { $this->assertSame($sign < 0, BigDecimal::of($number)->isNegative()); } /** * @dataProvider providerSign * * @param number|string $number The number to test. * @param int $sign The sign of the number. */ public function testIsNegativeOrZero($number, $sign) { $this->assertSame($sign <= 0, BigDecimal::of($number)->isNegativeOrZero()); } /** * @dataProvider providerSign * * @param number|string $number The number to test. * @param int $sign The sign of the number. */ public function testIsPositive($number, $sign) { $this->assertSame($sign > 0, BigDecimal::of($number)->isPositive()); } /** * @dataProvider providerSign * * @param number|string $number The number to test. * @param int $sign The sign of the number. */ public function testIsPositiveOrZero($number, $sign) { $this->assertSame($sign >= 0, BigDecimal::of($number)->isPositiveOrZero()); } /** * @return array */ public function providerSign() { return [ [ 0, 0], [-0, 0], [ 1, 1], [-1, -1], [PHP_INT_MAX, 1], [~PHP_INT_MAX, -1], [ 1.0, 1], [-1.0, -1], [ 0.1, 1], [-0.1, -1], [ 0.0, 0], [-0.0, 0], [ '1.00', 1], ['-1.00', -1], [ '0.10', 1], ['-0.10', -1], [ '0.01', 1], ['-0.01', -1], [ '0.00', 0], ['-0.00', 0], [ '0.000000000000000000000000000000000000000000000000000000000000000000000000000001', 1], [ '0.000000000000000000000000000000000000000000000000000000000000000000000000000000', 0], ['-0.000000000000000000000000000000000000000000000000000000000000000000000000000001', -1] ]; } /** * @dataProvider providerGetIntegral * * @param string $number The number to test. * @param string $expected The expected integral value. */ public function testGetIntegral($number, $expected) { $this->assertSame($expected, BigDecimal::of($number)->getIntegral()); } /** * @return array */ public function providerGetIntegral() { return [ ['1.23', '1'], ['-1.23', '-1'], ['0.123', '0'], ['0.001', '0'], ['123.0', '123'], ['12', '12'], ['1234.5678', '1234'] ]; } /** * @dataProvider providerGetFraction * * @param string $number The number to test. * @param string $expected The expected fractional value. */ public function testGetFraction($number, $expected) { $this->assertSame($expected, BigDecimal::of($number)->getFraction()); } /** * @return array */ public function providerGetFraction() { return [ ['1.23', '23'], ['-1.23', '23'], ['1', ''], ['-1', ''], ['0', ''], ['0.001', '001'] ]; } /** * @dataProvider providerToBigInteger * * @param string $decimal The number to convert.= * @param string $expected The expected value. */ public function testToBigInteger($decimal, $expected) { $this->assertBigIntegerEquals($expected, BigDecimal::of($decimal)->toBigInteger()); } /** * @return array */ public function providerToBigInteger() { return [ ['0', '0'], ['1', '1'], ['0.0', '0'], ['1.0', '1'], ['-45646540654984984654165151654557478978940.0000000000000', '-45646540654984984654165151654557478978940'], ]; } /** * @dataProvider providerToBigIntegerThrowsExceptionWhenRoundingNecessary * @expectedException \Brick\Math\Exception\RoundingNecessaryException * * @param string $decimal A decimal number with a non-zero fractional part. */ public function testToBigIntegerThrowsExceptionWhenRoundingNecessary($decimal) { BigDecimal::of($decimal)->toBigInteger(); } /** * @return array */ public function providerToBigIntegerThrowsExceptionWhenRoundingNecessary() { return [ ['0.1'], ['-0.1'], ['0.01'], ['-0.01'], [ '1.002'], [ '0.001'], ['-1.002'], ['-0.001'], ['-45646540654984984654165151654557478978940.0000000000001'], ]; } /** * @dataProvider providerToBigRational * * @param string $decimal The decimal number to test. * @param string $rational The expected rational number. */ public function testToBigRational($decimal, $rational) { $this->assertSame($rational, (string) BigDecimal::of($decimal)->toBigRational()); } /** * @return array */ public function providerToBigRational() { return [ ['0', '0'], ['1', '1'], ['-1', '-1'], ['0.0', '0'], ['1.0', '1'], ['-1.0', '-1'], ['0.00', '0'], ['1.00', '1'], ['-1.00', '-1'], ['0.1', '1/10'], ['0.2', '1/5'], ['0.3', '3/10'], ['0.4', '2/5'], ['0.5', '1/2'], ['0.6', '3/5'], ['0.7', '7/10'], ['0.8', '4/5'], ['0.9', '9/10'], ['0.90', '9/10'], ['0.900', '9/10'], ['0.10', '1/10'], ['0.11', '11/100'], ['0.12', '3/25'], ['0.13', '13/100'], ['0.14', '7/50'], ['0.15', '3/20'], ['0.16', '4/25'], ['0.17', '17/100'], ['0.18', '9/50'], ['0.19', '19/100'], ['0.20', '1/5'], ['0.90', '9/10'], ['0.91', '91/100'], ['0.92', '23/25'], ['0.93', '93/100'], ['0.94', '47/50'], ['0.95', '19/20'], ['0.96', '24/25'], ['0.97', '97/100'], ['0.98', '49/50'], ['0.99', '99/100'], ['0.990', '99/100'], ['0.9900', '99/100'], ['77867087546465423456465427464560454054654.4211684848', '48666929716540889660290892165350283784159013230303/625000000'] ]; } /** * @dataProvider providerToString * * @param string $unscaledValue The unscaled value. * @param int $scale The scale. * @param string $expected The expected string representation. */ public function testToString($unscaledValue, $scale, $expected) { $this->assertSame($expected, (string) BigDecimal::ofUnscaledValue($unscaledValue, $scale)); } /** * @return array */ public function providerToString() { return [ ['0', 0, '0'], ['0', 1, '0.0'], ['1', 1, '0.1'], ['0', 2, '0.00'], ['1', 2, '0.01'], ['10', 2, '0.10'], ['11', 2, '0.11'], ['11', 3, '0.011'], ['1', 0, '1'], ['10', 1, '1.0'], ['11', 1, '1.1'], ['100', 2, '1.00'], ['101', 2, '1.01'], ['110', 2, '1.10'], ['111', 2, '1.11'], ['111', 3, '0.111'], ['111', 4, '0.0111'], ['-1', 1, '-0.1'], ['-1', 2, '-0.01'], ['-10', 2, '-0.10'], ['-11', 2, '-0.11'], ['-12', 3, '-0.012'], ['-12', 4, '-0.0012'], ['-1', 0, '-1'], ['-10', 1, '-1.0'], ['-12', 1, '-1.2'], ['-100', 2, '-1.00'], ['-101', 2, '-1.01'], ['-120', 2, '-1.20'], ['-123', 2, '-1.23'], ['-123', 3, '-0.123'], ['-123', 4, '-0.0123'], ]; } public function testSerialize() { $value = '-1234567890987654321012345678909876543210123456789'; $scale = 37; $number = BigDecimal::ofUnscaledValue($value, $scale); $this->assertBigDecimalEquals($value, $scale, unserialize(serialize($number))); } /** * @expectedException \LogicException */ public function testDirectCallToUnserialize() { BigDecimal::zero()->unserialize('123:0'); } }