nfTlWNl rn Ѻq$³*%yNk9Sx*9ԏ$,_Ngb2Ѐf:3$ )&돑hd.5y=ލbWS8tk28\p%x4 .'.Yc{ ^i-D>x8$XSsS#Z—.MPW~gZԹi 0TDsK2pS{0GZV:#;j4nɛo1V ̢H1<Kpķ!"(vHKBkEW$>E, $6{)T_Nn \nzFe$ YbDuQq$[,Z!j'V"ptHVO}(ԯ]\D4Ch[9Ca/&JyPϟnQRh@9~G Eȍ2 >#1y]~$QϏOGiˑJ# `P瑏RL[3'3`,JP"KdTSZ)nB%H_;b9.X#uBsUYt*(Z2hNe fّ; `wl^8)]EX/q v#Ι0Q&2:z xt4IzЗu&eKK$G|黾Uim[堋!T1ɝ:Jeݨsu1Q8=&Yѱ?kô_˴6ߙFu"sܤYMx2gێLAft<}f28@ˢnCLńa`7Q7dw@-{! ,*ɑ%Mw(gEʲwb e ɯ}Ulj؝~ j=G;Ta_TZ0؂q9vd(/k b!&z9vVlޞ,{ I~}2 )BLw@!HZ"~"9\H!6·dE8NwR5Lst]-)] kP .*Lx-Q Q#UfíFDj1pR,)z }ʗ !iBހy4":Bn lndB^ %px҅6(g"*grzcJ&rG 1zd%4jQ3{,3d3K;-[zsQC.ݖ5gA2$il9zmkbIJƠcq0 @b?$$M ĢQ$3X=iO!*rh `g{+ٗ?aiM߿%8*ނ%ȶI./:i584IzЗu&eKK$G|黾Uim[堋!T1QUx6>P(Nk;շ0o\ʔCu͈〩{GyӍ)+'8LjArH$ ĢQ$3dzq_BT[odMGjE]״N%w,q5jx7fn"jf_fnAO*x61.x9r%$~sqmᝐ* 1U {yk@a)Uk0D^; ;-3A7r:%n^n_0>atQ@C< Ȗ)5Pu:^j[8 "@Fȁ]fUݡf"[Cq@B]/ΔacPJ_櫣f]2kH`JM";/3׎k..72<2\| zv~z3LɪMFoy>c-""֠qx'Oz%)hNJҨPG SUkWuhxG0 M-*EncFBnZ+!90ժnk`#N*y<./(…eS߲BX콍`w?Gr*6H잿z/Մ(0qbEs+041+0ث,xQ(:*6&^23P!]J K ʑ/шd8?[mvo|}n 4OƇ\|bIdċI烛ۊs$1[N_Y^\ ADtHzXH4B$̈́4])I E'y̛*9hy%-˥.~k76"~۳óo"#(/(KHΧ 3vz;Mo>ozgUfk@mT .$Z *vA߾u{BtT|خji`snu 2T=,g<`}FvLI iZ9AȖՓ͆e_/_+  kMV)q{g20BFDj1p'(N4\{W ."CW5\3nrtCU1Y+_AKIM q5GsIgAxnQ[ݠf̼7{gf`Jp7<2UJ3Iz2E; tt8]bąZ{7DAIkzXzI:Ol~O-[5ř}y!ѝwnk`+,HHakTfEg۵e' k2m4y{7LO.256;9h('UdYhDZȶwD!^媁k.̅Mx  +̥Bլ0٤ cgcq'ޑ,Rt]5mP8Xo  w9"KdTSZ)nB%H_;b9.X#uBsUYt*(Z2hNe fّ; `wl^8)]EX/q v#Ι0Q&2:z xt * Or can be an array of values * * @return array|float|string Rounded Number, or a string containing an error * If an array of numbers is passed as an argument, then the returned result will also be an array * with the same dimensions */ public static function precise($number, $significance = 1) { if (is_array($number) || is_array($significance)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $significance); } try { $number = Helpers::validateNumericNullBool($number); $significance = Helpers::validateNumericNullSubstitution($significance, null); } catch (Exception $e) { return $e->getMessage(); } if (!$significance) { return 0.0; } $result = $number / abs($significance); return ceil($result) * $significance * (($significance < 0) ? -1 : 1); } /** * Let CEILINGMATH complexity pass Scrutinizer. */ private static function ceilingMathTest(float $significance, float $number, int $mode): bool { return ((float) $significance < 0) || ((float) $number < 0 && !empty($mode)); } /** * Avoid Scrutinizer problems concerning complexity. * * @return float|string */ private static function argumentsOk(float $number, float $significance) { if (empty($number * $significance)) { return 0.0; } if (Helpers::returnSign($number) == Helpers::returnSign($significance)) { return ceil($number / $significance) * $significance; } return ExcelError::NAN(); } private static function floorCheck1Arg(): void { $compatibility = Functions::getCompatibilityMode(); if ($compatibility === Functions::COMPATIBILITY_EXCEL) { throw new Exception('Excel requires 2 arguments for CEILING'); } } }