32 lines
907 B
Python
32 lines
907 B
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(c: str, j: str) -> RoundingResult:
|
|
cv = _d(c)
|
|
jv = _d(j)
|
|
if cv is None or jv is None:
|
|
return RoundingResult(mode="UNKNOWN", confidence=0, suggestion="parse error")
|
|
if cv == jv:
|
|
return RoundingResult()
|
|
diff = abs(float(cv - jv))
|
|
mag = max(abs(float(cv)), abs(float(jv)), 1)
|
|
rel = diff / mag
|
|
if diff < 2:
|
|
return RoundingResult("TRUNCATE", 0.6, f"Likely TRUNCATE, diff={diff}")
|
|
if diff < 100:
|
|
return RoundingResult("ROUNDING", 0.4, f"Possible rounding, diff={diff}")
|
|
return RoundingResult("SIGNIFICANT", 0.9, f"Significant diff={diff}")
|
|
|
|
|
|
def _d(v):
|
|
try:
|
|
return Decimal(str(v).strip())
|
|
except:
|
|
return None
|