47 lines
1.4 KiB
Python
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
|