v1: executing-plans 模式生成,54 文件 1320 行 Python
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
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
|
||||
Reference in New Issue
Block a user