```python
import math


def tiles_across(length: int, tile: int) -> int:
    """Calculate how many tiles of a given size cover a length, rounding up."""
    if length < 0 or tile <= 0:
        raise ValueError("length must be non-negative and tile must be positive")
    return math.ceil(length / tile)


def tiles_needed(width: int, height: int, tile: int, spare: int) -> int:
    """Calculate the total tiles needed for a wall, including a spare percentage."""
    if width < 0 or height < 0 or tile <= 0 or spare < 0:
        raise ValueError("Dimensions and tile size must be non-negative/positive, spare must be non-negative")
    
    tiles_width = tiles_across(width, tile)
    tiles_height = tiles_across(height, tile)
    
    base_count = tiles_width * tiles_height
    
    # Add spare percentage, rounding up
    if spare > 0:
        # Calculate spare amount: base_count * spare / 100
        # We need to round up the total including the spare
        # Total = base_count + ceil(base_count * spare / 100)
        # Or equivalently: ceil(base_count * (100 + spare) / 100)
        total = math.ceil(base_count * (100 + spare) / 100)
    else:
        total = base_count
        
    return total
```