------
## 最终结论
```python
def fraction_to_string(numerator: int, denominator: int) -> str:
    if numerator == 0:
        return "0"
    
    # Handle the sign of the result
    sign = '-' if (numerator < 0) ^ (denominator < 0) else ''
    
    # Work with absolute values
    numerator, denominator = abs(numerator), abs(denominator)
    
    # Calculate the integer part
    integer_part = numerator // denominator
    result = sign + str(integer_part)
    
    # If there is no fractional part, return the result
    remainder = numerator % denominator
    if remainder == 0:
        return result
    
    # Process the fractional part
    result += '.'
    
    # Dictionary to store the position of each remainder
    remainder_map = {}
    fractional_part = ''
    
    index = 0
    while remainder != 0:
        # If we have seen this remainder before, we found a repeating cycle
        if remainder in remainder_map:
            start_index = remainder_map[remainder]
            fractional_part = fractional_part[:start_index] + '(' + fractional_part[start_index:] + ')'
            break
        
        # Store the position of this remainder
        remainder_map[remainder] = index
        
        # Multiply remainder by 10 and get next digit
        remainder *= 10
        fractional_digit = remainder // denominator
        fractional_part += str(fractional_digit)
        
        # Update the remainder
        remainder %= denominator
        
        index += 1
    
    return result + fractional_part

# Example usage:
print(fraction_to_string(1, 2))  # Output: "0.5"
print(fraction_to_string(2, 1))  # Output: "2"
print(fraction_to_string(2, 3))  # Output: "0.(6)"
```