Files
cobol-java/comparator/rounding_detect.py
T

47 lines
1.4 KiB
Python

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