from dataclasses import dataclass from decimal import Decimal, InvalidOperation @dataclass class RoundingResult: mode: str = "EXACT" confidence: float = 1.0 suggestion: str = "" def detect_rounding(cobol_value: str, java_value: str) -> RoundingResult: c = _to_decimal(cobol_value) j = _to_decimal(java_value) if c is None or j is None: return RoundingResult(mode="UNKNOWN", confidence=0.0, suggestion="cannot parse values") if c == j: return RoundingResult(mode="EXACT", confidence=1.0, suggestion="values are identical") diff = abs(float(c - j)) magnitude = max(abs(float(c)), abs(float(j)), 1.0) relative_diff = diff / magnitude if diff < 2.0: mode = "TRUNCATE" confidence = 0.6 suggestion = f"Likely TRUNCATE rounding: COBOL truncates, Java rounds or retains precision. Diff: {diff}" elif diff < 100.0: mode = "ROUNDING" confidence = 0.4 suggestion = f"Possible rounding difference. Diff: {diff}" else: mode = "SIGNIFICANT" confidence = 0.9 suggestion = f"Values differ significantly (diff={diff}) — not a rounding issue" return RoundingResult(mode=mode, confidence=confidence, suggestion=suggestion) def _to_decimal(val: str): try: return Decimal(str(val).strip()) except (InvalidOperation, ValueError): return None