# Bad value “0” for attribute “step” on element “input”: Zero is not a valid positive floating point number.

> Canonical HTML version: https://rocketvalidator.com/html-validation/bad-value-0-for-attribute-step-on-element-input-zero-is-not-a-valid-positive-floating-point-number
> Attribution: Rocket Validator (https://rocketvalidator.com)
> License: CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)

The `step` attribute specifies the granularity that an input's value must adhere to. It controls the increment when a user clicks the up/down spinner buttons on a number input, moves a slider on a range input, or adjusts date and time inputs. The browser also uses this value during constraint validation to determine which values are considered valid based on the stepping base (typically the `min` value or the input's default).

When the HTML specification defines the `step` attribute, it requires the value to be a **valid floating-point number greater than zero**. A value of `"0"` is explicitly invalid because a step of zero means no increment at all — it's logically meaningless. You can't step through values in increments of nothing. The W3C validator flags this as an error because `"0"` fails the requirement of being a positive number.

### Why this matters

- **Standards compliance:** The WHATWG HTML living standard explicitly requires `step` to parse as a number greater than zero. A value of `"0"` violates this rule.
- **Browser behavior:** While browsers may not crash on `step="0"`, the behavior becomes unpredictable. Spinner buttons may stop working, and form validation may not function as expected.
- **Accessibility:** Assistive technologies rely on correct `step` values to communicate valid input ranges to users. An invalid step can lead to a confusing experience.

### How to fix it

Choose the appropriate fix depending on your intent:

1. **If you want specific increments** (e.g., whole numbers, cents, tenths), set `step` to the desired interval like `"1"`, `"0.01"`, or `"0.1"`.
2. **If you want to allow any value with no stepping constraint**, use the special keyword `step="any"`. This tells the browser that no stepping is implied and any floating-point value is acceptable.
3. **If you don't need the attribute at all**, simply remove it. Each input type has a default step value (e.g., `1` for `type="number"`).

## Examples

### ❌ Invalid: `step` set to zero

```html
<label for="price">Price:</label>
<input id="price" name="price" type="number" step="0" min="0">
```

This triggers the validation error because `"0"` is not a valid positive floating-point number.

### ✅ Fixed: using a specific step value

If you want the input to accept values in increments of one cent:

```html
<label for="price">Price:</label>
<input id="price" name="price" type="number" step="0.01" min="0">
```

Valid values would include `0`, `0.01`, `0.02`, `1.50`, `99.99`, and so on.

### ✅ Fixed: using `step="any"` for unrestricted precision

If you want to allow any numeric value without stepping constraints:

```html
<label for="price">Price:</label>
<input id="price" name="price" type="number" step="any" min="0">
```

This permits any floating-point value, such as `3.14159` or `0.007`.

### ✅ Fixed: using a whole number step with a non-zero minimum

```html
<label for="quantity">Quantity:</label>
<input id="quantity" name="quantity" type="number" step="2" min="1.3">
```

With `step="2"` and `min="1.3"`, valid values include `1.3`, `3.3`, `5.3`, `7.3`, and so on. The stepping base is `1.3`, and each valid value is an even multiple of `2` away from it.

### ✅ Fixed: removing the attribute entirely

If the default step behavior is sufficient, simply omit the attribute:

```html
<label for="amount">Amount:</label>
<input id="amount" name="amount" type="number" min="0">
```

The default `step` for `type="number"` is `1`, so valid values are whole numbers (`0`, `1`, `2`, etc.).
