Passed
Push — master ( 4b8292...9204d2 )
by Mark
10:15
created

Round::multiple()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 19
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 5

Importance

Changes 0
Metric Value
cc 5
eloc 11
nc 5
nop 2
dl 0
loc 19
ccs 11
cts 11
cp 1
crap 5
rs 9.6111
c 0
b 0
f 0
1
<?php
2
3
namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig;
4
5
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
6
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
7
8
class Round
9
{
10
    /**
11
     * ROUND.
12
     *
13
     * Returns the result of builtin function round after validating args.
14
     *
15
     * @param mixed $number Should be numeric
16
     * @param mixed $precision Should be int
17
     *
18
     * @return float|string Rounded number
19
     */
20 30
    public static function round($number, $precision)
21
    {
22
        try {
23 30
            $number = Helpers::validateNumericNullBool($number);
24 28
            $precision = Helpers::validateNumericNullBool($precision);
25 3
        } catch (Exception $e) {
26 3
            return $e->getMessage();
27
        }
28
29 27
        return round($number, (int) $precision);
30
    }
31
32
    /**
33
     * ROUNDUP.
34
     *
35
     * Rounds a number up to a specified number of decimal places
36
     *
37
     * @param float $number Number to round
38
     * @param int $digits Number of digits to which you want to round $number
39
     *
40
     * @return float|string Rounded Number, or a string containing an error
41
     */
42 29
    public static function up($number, $digits)
43
    {
44
        try {
45 29
            $number = Helpers::validateNumericNullBool($number);
46 27
            $digits = (int) Helpers::validateNumericNullSubstitution($digits, null);
47 3
        } catch (Exception $e) {
48 3
            return $e->getMessage();
49
        }
50
51 26
        if ($number == 0.0) {
52 4
            return 0.0;
53
        }
54
55 22
        if ($number < 0.0) {
56 6
            return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN);
57
        }
58
59 16
        return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN);
60
    }
61
62
    /**
63
     * ROUNDDOWN.
64
     *
65
     * Rounds a number down to a specified number of decimal places
66
     *
67
     * @param float $number Number to round
68
     * @param int $digits Number of digits to which you want to round $number
69
     *
70
     * @return float|string Rounded Number, or a string containing an error
71
     */
72 29
    public static function down($number, $digits)
73
    {
74
        try {
75 29
            $number = Helpers::validateNumericNullBool($number);
76 27
            $digits = (int) Helpers::validateNumericNullSubstitution($digits, null);
77 3
        } catch (Exception $e) {
78 3
            return $e->getMessage();
79
        }
80
81 26
        if ($number == 0.0) {
82 4
            return 0.0;
83
        }
84
85 22
        if ($number < 0.0) {
86 6
            return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP);
87
        }
88
89 16
        return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP);
90
    }
91
92
    /**
93
     * MROUND.
94
     *
95
     * Rounds a number to the nearest multiple of a specified value
96
     *
97
     * @param mixed $number Expect float. Number to round.
98
     * @param mixed $multiple Expect int. Multiple to which you want to round.
99
     *
100
     * @return float|string Rounded Number, or a string containing an error
101
     */
102 25
    public static function multiple($number, $multiple)
103
    {
104
        try {
105 25
            $number = Helpers::validateNumericNullSubstitution($number, 0);
106 21
            $multiple = Helpers::validateNumericNullSubstitution($multiple, null);
107 5
        } catch (Exception $e) {
108 5
            return $e->getMessage();
109
        }
110
111 20
        if ($number == 0 || $multiple == 0) {
112 4
            return 0;
113
        }
114 16
        if ((Helpers::returnSign($number)) == (Helpers::returnSign($multiple))) {
115 15
            $multiplier = 1 / $multiple;
116
117 15
            return round($number * $multiplier) / $multiplier;
118
        }
119
120 1
        return Functions::NAN();
121
    }
122
}
123