From bd87f30277be0a3e4c26f5c3acb087000008a80c Mon Sep 17 00:00:00 2001 From: Peter Mead Date: Tue, 28 Nov 2017 16:37:34 +0000 Subject: [PATCH 1/2] Don't use PHP's fmod PHP's fmod has some quirks. The private fmod function wraps it to iron out some of those quirks but ultimately it's better to just not use it. --- src/JsonSchema/Constraints/NumberConstraint.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/JsonSchema/Constraints/NumberConstraint.php b/src/JsonSchema/Constraints/NumberConstraint.php index aeea855d..a2b91a76 100644 --- a/src/JsonSchema/Constraints/NumberConstraint.php +++ b/src/JsonSchema/Constraints/NumberConstraint.php @@ -71,7 +71,7 @@ public function check(&$element, $schema = null, JsonPointer $path = null, $i = private function fmod($number1, $number2) { $number1 = abs($number1); - $modulus = fmod($number1, $number2); + $modulus = ($number1 - round($number1 / $number2) * $number2); $precision = abs(0.0000000001); $diff = (float) ($modulus - $number2); From 1b51bd2cd4391ff619583ebf627f28c467565cfb Mon Sep 17 00:00:00 2001 From: Peter Mead Date: Wed, 29 Nov 2017 15:58:40 +0000 Subject: [PATCH 2/2] Simplify the private fmod function Now that the private fmod function is not using PHP's fmod we can remove the code which was working around it's quirks. --- src/JsonSchema/Constraints/NumberConstraint.php | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/JsonSchema/Constraints/NumberConstraint.php b/src/JsonSchema/Constraints/NumberConstraint.php index a2b91a76..c1b15f94 100644 --- a/src/JsonSchema/Constraints/NumberConstraint.php +++ b/src/JsonSchema/Constraints/NumberConstraint.php @@ -70,18 +70,13 @@ public function check(&$element, $schema = null, JsonPointer $path = null, $i = private function fmod($number1, $number2) { - $number1 = abs($number1); $modulus = ($number1 - round($number1 / $number2) * $number2); - $precision = abs(0.0000000001); - $diff = (float) ($modulus - $number2); + $precision = 0.0000000001; - if (-$precision < $diff && $diff < $precision) { + if (-$precision < $modulus && $modulus < $precision) { return 0.0; } - $decimals1 = mb_strpos($number1, '.') ? mb_strlen($number1) - mb_strpos($number1, '.') - 1 : 0; - $decimals2 = mb_strpos($number2, '.') ? mb_strlen($number2) - mb_strpos($number2, '.') - 1 : 0; - - return (float) round($modulus, max($decimals1, $decimals2)); + return $modulus; } }