= 0.5; otherwise, behaves as for Down. * Note that this is the rounding mode commonly taught at school. * * Equivalent native PHP rounding mode: {@see \RoundingMode::HalfAwayFromZero}. */ case HalfUp; /** * Rounds towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. * * Behaves as for Up if the discarded fraction is > 0.5; otherwise, behaves as for Down. * * Equivalent native PHP rounding mode: {@see \RoundingMode::HalfTowardsZero}. */ case HalfDown; /** * Rounds towards "nearest neighbor" unless both neighbors are equidistant, in which case round towards positive infinity. * * If the result is positive, behaves as for HalfUp; if negative, behaves as for HalfDown. * * Equivalent native PHP rounding mode: none. */ case HalfCeiling; /** * Rounds towards "nearest neighbor" unless both neighbors are equidistant, in which case round towards negative infinity. * * If the result is positive, behaves as for HalfDown; if negative, behaves as for HalfUp. * * Equivalent native PHP rounding mode: none. */ case HalfFloor; /** * Rounds towards the "nearest neighbor" unless both neighbors are equidistant, in which case rounds towards the even neighbor. * * Behaves as for HalfUp if the digit to the left of the discarded fraction is odd; * behaves as for HalfDown if it's even. * * Note that this is the rounding mode that statistically minimizes * cumulative error when applied repeatedly over a sequence of calculations. * It is sometimes known as "Banker's rounding", and is the default rounding mode in IEEE 754. * * Equivalent native PHP rounding mode: {@see \RoundingMode::HalfEven}. */ case HalfEven; /** * Rounds towards the "nearest neighbor" unless both neighbors are equidistant, in which case rounds towards the odd neighbor. * * Behaves as for HalfUp if the digit to the left of the discarded fraction is even; * behaves as for HalfDown if it's odd. * * Like HalfEven, this rounding mode is free of bias towards or away from zero on ties; * unlike HalfEven, ties never round to an even digit — in particular, never to zero or to a multiple of ten. * * Equivalent native PHP rounding mode: {@see \RoundingMode::HalfOdd}. */ case HalfOdd; /** * Returns the equivalent of the given native PHP rounding mode. * * Note that PHP's RoundingMode enum is only available on PHP 8.4 and later. * * @pure */ public static function fromNativeRoundingMode(\RoundingMode $roundingMode): self { return match ($roundingMode) { \RoundingMode::AwayFromZero => self::Up, \RoundingMode::TowardsZero => self::Down, \RoundingMode::PositiveInfinity => self::Ceiling, \RoundingMode::NegativeInfinity => self::Floor, \RoundingMode::HalfAwayFromZero => self::HalfUp, \RoundingMode::HalfTowardsZero => self::HalfDown, \RoundingMode::HalfEven => self::HalfEven, \RoundingMode::HalfOdd => self::HalfOdd, }; } }