Passed
Push — master ( ac5b96...b01a48 )
by Mark
08:23
created

Round::odd()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 19
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
eloc 11
nc 4
nop 1
dl 0
loc 19
ccs 11
cts 11
cp 1
crap 4
rs 9.9
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
    /**
124
     * EVEN.
125
     *
126
     * Returns number rounded up to the nearest even integer.
127
     * You can use this function for processing items that come in twos. For example,
128
     *        a packing crate accepts rows of one or two items. The crate is full when
129
     *        the number of items, rounded up to the nearest two, matches the crate's
130
     *        capacity.
131
     *
132
     * Excel Function:
133
     *        EVEN(number)
134
     *
135
     * @param float $number Number to round
136
     *
137
     * @return float|string Rounded Number, or a string containing an error
138
     */
139 20
    public static function even($number)
140
    {
141
        try {
142 20
            $number = Helpers::validateNumericNullBool($number);
143 1
        } catch (Exception $e) {
144 1
            return $e->getMessage();
145
        }
146
147 19
        return Helpers::getEven($number);
148
    }
149
150
    /**
151
     * ODD.
152
     *
153
     * Returns number rounded up to the nearest odd integer.
154
     *
155
     * @param float $number Number to round
156
     *
157
     * @return float|string Rounded Number, or a string containing an error
158
     */
159 16
    public static function odd($number)
160
    {
161
        try {
162 16
            $number = Helpers::validateNumericNullBool($number);
163 1
        } catch (Exception $e) {
164 1
            return $e->getMessage();
165
        }
166
167 15
        $significance = Helpers::returnSign($number);
168 15
        if ($significance == 0) {
169 4
            return 1;
170
        }
171
172 11
        $result = ceil($number / $significance) * $significance;
173 11
        if ($result == Helpers::getEven($result)) {
174 6
            $result += $significance;
175
        }
176
177 11
        return $result;
178
    }
179
}
180