24 lines
1.2 KiB
Python
24 lines
1.2 KiB
Python
"""순수 계산 함수 — DB 접근 없음. 원본: schedules/anchoring/src/anchoring/service.py 에서
|
||
읽기 경로(칸 해석·앵커가 산출) 두 함수만 발췌 이식. 표본 판정·평가 함수는 배치 전용이라 제외.
|
||
|
||
모든 산술은 정수(천분율 ‰). float 금지 — 10원 단위 반올림의 정확성 보장.
|
||
"""
|
||
from bisect import bisect_right
|
||
|
||
from common.anchoring.constants import PRICE_RANGE_INDEX_MAX, UPPER_BOUNDS
|
||
|
||
|
||
def calc_price_range_index(target_price: int) -> int:
|
||
"""목표가 → 가격구간 인덱스(0-기반). 자릿수 계단식 사다리.
|
||
|
||
좌폐우개 [이전 ub, ub): 가격이 upper_bound 와 정확히 같으면 다음 칸.
|
||
1억 이상은 마지막 인덱스로 클램프. 정적 테이블 idx = 반환값 + 1"""
|
||
return min(bisect_right(UPPER_BOUNDS, target_price), PRICE_RANGE_INDEX_MAX)
|
||
|
||
|
||
def calc_anchoring_price(target_price: int, anchoring_value: int) -> int:
|
||
"""앵커링가 = 목표가 × (1 − A), 10원 단위 반올림. (정수 연산만 — float 곱셈 재도입 금지)
|
||
|
||
schedules/anchoring 의 제안 시점 앵커와 동일 공식 — 생성·제안 앵커가 10원 단위로 일치."""
|
||
return (target_price * (1000 - anchoring_value) + 5000) // 10000 * 10
|