def params_to_string(num_params, units=None, precision=2):
    """Convert parameter number into a string.
    Args:
        num_params (float): Parameter number to be converted.
        units (str | None): Converted FLOPs units. Options are None, 'M',
            'K' and ''. If set to None, it will automatically choose the most
            suitable unit for Parameter number. Default: None.
        precision (int): Digit number after the decimal point. Default: 2.
    Returns:
        str: The converted parameter number with units.
    Examples:
        >>> params_to_string(1e9)
        '1000.0 M'
        >>> params_to_string(2e5)
        '200.0 k'
        >>> params_to_string(3e-9)
        '3e-09'
    """
    if units is None:
        if num_params // 10 ** 6 > 0:
            return str(round(num_params / 10 ** 6, precision)) + " M"
        elif num_params // 10 ** 3:
            return str(round(num_params / 10 ** 3, precision)) + " k"
        else:
            return str(num_params)
    else:
        if units == "M":
            return str(round(num_params / 10.0 ** 6, precision)) + " " + units
        elif units == "K":
            return str(round(num_params / 10.0 ** 3, precision)) + " " + units
        else:
            return str(num_params)