$step) { return false; } // The computation follows HTML5 4.10.7.2.10 `The step attribute' : // ... that number subtracted from the step base is not an integral multiple // of the allowed value step, the element is suffering from a step mismatch. (double) $remainder = abs($doubleValue - $step * round($doubleValue / $step)); // Accepts erros in lower fractional part which IEEE 754 single-precision // can't represent. $computedAcceptableError = (double)($step / pow(2.0, DBL_MANT_DIG)); return $computedAcceptableError < $remainder && $remainder < ($step - $computedAcceptableError); } $value = 609.090909; $step = 9.09090909; if (stepMismatch($value, $step)) { echo "INVALID\n"; } else { echo "VALID\n"; // Print Valid } $value = 1.2; $step = 0.5; if (stepMismatch($value, $step)) { echo "INVALID\n"; // Print Invalid } else { echo "VALID\n"; } $value = 0.9411764; $step = 0.00392156863; if (stepMismatch($value, $step)) { echo "INVALID\n"; // Print Invalid } else { echo "VALID\n"; } $value = 0.9411764712; $step = 0.00392156863; if (stepMismatch($value, $step)) { echo "INVALID\n"; } else { echo "VALID\n"; // Print valid } $value = 0.1; $step = 0.2; if (stepMismatch($value, $step)) { echo "INVALID\n"; // Print Invalid } else { echo "VALID\n"; } $value = 0.1; $step = 0.2; $min = -0.3; if (stepMismatch($value, $step, $min)) { echo "INVALID\n"; } else { echo "VALID\n"; // Print valid } ?>