콘텐츠로 건너뛰기

Odoo Float Field 완전 정복 가이드

Odoo 데이터 모델에서 Float 필드를 다루는 실전 가이드입니다. 기본 설정부터 소수점 정밀도 관리, 고급 커스터마이징까지 실제 개발 현장에서 바로 적용할 수 있는 팁과 주의사항을 한데 모았습니다.
2026년 3월 6일 작성자
Odoo Float Field 완전 정복 가이드
Dasolo
| 아직 댓글이 없습니다

소개


Odoo에서 소수점이 필요한 데이터를 다룰 때 가장 자주 쓰이는 필드 타입이 Float입니다. 단가, 제품 무게, 할인율, 세율, 자재표의 환산계수 같은 값들은 정수로 표현할 수 없기 때문에 보통 Float 필드에 저장합니다.


겉으로 보면 단순한 숫자 입력처럼 보이지만, 소수점 정밀도 처리, 집계·보고에서의 동작, 경우에 따라 다른 필드 타입을 써야 하는 판단 등 알아둘 점이 여러 가지 있습니다.


이 가이드는 Float 필드가 무엇을 저장하는지, Odoo 내부에서 어떻게 동작하는지, Odoo Studio나 Python으로 어떻게 만들고 조정하는지, 그리고 영업·재고·회계 등 실제 업무에서의 활용 예를 다룹니다.

Odoo에서 Float 필드란 무엇인가


Odoo ORM에서 Float 필드는 소수점 숫자를 저장합니다. 내부적으로 PostgreSQL의 double precision 컬럼으로 매핑되어 약 15자리의 유효숫자(시그니피컨트 디지트)를 제공합니다. 대부분의 업무용에는 이 정도 정밀도로 충분합니다.


사용자 화면에서 Float 필드는 숫자 입력란으로 보입니다. 화면에 표시되는 소수 자리수는 필드에 설정한 digits 파라미터로 제어됩니다. 목록(list) 화면에서는 기본적으로 오른쪽 정렬로 표시되고, 피벗이나 그래프에서는 합계·평균 등 집계 연산에 참여합니다.


Python 모델 정의에서의 예시(개념 설명)

from odoo import fields, models

class SaleOrderLine(models.Model):
    _inherit = 'sale.order.line'

    custom_margin = fields.Float(
        string='Custom Margin',
        digits=(5, 2),
        default=0.0,
    )

digits 파라미터는 튜플입니다. 첫 숫자는 전체 유효숫자 자리수, 두 번째는 소수 자릿수입니다. 예를 들어 (5, 2)는 총 다섯 자리 중 소수 둘 자리가 허용된다는 의미입니다.

숫자를 하드코딩하는 대신 이름붙은 정밀도 그룹을 참조할 수도 있습니다.


price_premium = fields.Float(
    string='Price Premium',
    digits='Product Price',
)

Odoo에는 관리자 > 기술 설정 > 데이터베이스 구조 > 소수점 정밀도(Decimal Accuracy)에 여러 기본 그룹이 정의되어 있습니다. 대표적으로 Product Price, Product Unit of Measure, Discount, Stock Weight 등이 있으며, 이런 그룹을 쓰면 코드 변경 없이 UI에서 소수점 정밀도를 조정할 수 있습니다.


Odoo Studio에서는 Float 필드가 '소수(Decimal Number)'로 표시됩니다. Studio로 만들면 기본 정밀도를 사용하지만, 속성 패널에서 별도 설정할 수 있어 비개발자가 폼을 빠르게 확장할 때 편리합니다.

필드의 동작 방식


모듈 설치나 업그레이드 시점에 Odoo 프레임워크가 데이터베이스 컬럼을 자동으로 생성해 주므로 별도의 SQL이나 마이그레이션 스크립트가 필요하지 않습니다.


digits 파라미터는 표시되는 소수 자리수뿐 아니라 저장 시의 반올림에도 영향을 줍니다. 예를 들어 digits=(6, 2)로 설정된 필드에 3.14159를 입력하면 ORM에서 3.14로 반올림되어 저장됩니다. 이 처리는 단순한 화면 표시가 아니라 저장 단계에서 이루어집니다.


중요 속성 요약

Odoo에서 Float 필드에 설정할 수 있는 주요 속성들입니다:

  • digits: (6, 2) 같은 튜플 또는 이름붙은 정밀도 그룹 문자열. 표시와 저장 정밀도를 제어합니다.
  • required: 필드를 필수로 만듭니다. 주의할 점은 0.0 값은 필수 체크를 통과하므로 의도와 다를 수 있습니다.
  • default: 새 레코드 생성시 기본값. default=0.0로 두면 필드가 False(없음) 대신 항상 숫자 값을 가집니다.
  • compute: Python 메서드로 값을 계산하게 할 때 사용합니다. 마진이나 환산값처럼 계산된 값을 저장할 때 유용합니다.
  • store: compute와 함께 사용하면 계산 결과를 DB에 저장해 검색·필터·그룹화가 가능해집니다.
  • group_operator: 피벗·그래프에서의 집계 방식을 정의합니다. 'sum', 'avg', 'min', 'max' 등이 있으며 기본값은 'sum'입니다.
  • copy: 레코드를 복사할 때 값 복사를 허용할지 여부. 기본값은 True입니다.

뷰에서의 표시 방식

폼 뷰에서는 숫자 입력란으로 표시되며, 소수점 구분자는 사용자 로케일을 따릅니다. 목록 뷰에서는 오른쪽 정렬이 기본이고, 검색 뷰에서는 숫자 비교 연산자로 필터링할 수 있습니다.


뷰에 위젯을 적용할 수도 있습니다. 예를 들어 percentage 위젯은 내부 저장값을 100배로 표시하고 % 기호를 추가합니다. 0–1 범위의 비율을 0–100%로 보이게 하는 흔한 패턴입니다.


ORM과의 상호작용

Float 필드를 읽으면 Python float 값이 반환됩니다. 값이 설정되지 않았고 기본값이 없으면 False를 반환합니다. 쓰기 작업은 정수, 실수, False를 허용하며 ORM은 저장 시 digits에 따라 반올림을 적용합니다.


개발 시 중요한 점: Python에서 == 로 Float를 직접 비교하지 마세요. 하드웨어 수준의 부동소수점 동작 때문에 외형상 동일한 값이 같지 않을 수 있습니다. 대신 odoo.tools.float_utils의 float_compare와 float_is_zero를 사용해 필드에 설정된 정밀도를 존중한 비교를 수행하세요.

비즈니스 활용 사례


Float 필드는 거의 모든 모듈에서 사용됩니다. 다음은 실무에서 흔히 만나는 다섯 가지 예입니다.


영업: 주문 라인의 할인율

sale.order.line의 discount 필드는 Float입니다. 영업 담당자가 15%를 입력하면 15.0으로 저장되어 단가 계산에 반영되고, 견적서·송장 및 손익 보고서에 영향을 줍니다. 할인값은 고객과의 커뮤니케이션 및 이익 분석에 모두 중요합니다.


재고: 제품의 무게와 부피

제품에는 weight, volume 같은 Float 필드가 기본으로 있습니다. 예컨대 2.5kg이나 0.003 m3 같은 값은 정수가 불가능하므로 소수값이 필요합니다. 이러한 값은 배송비 산정이나 배송사 연동에 바로 쓰이므로 정확도가 중요합니다.


회계: 세율

account.tax의 세율은 Float로 저장됩니다. 예를 들어 표준 VAT 21%는 21.0으로 저장되며, 계산 엔진이 각 송장과 매입청구서의 세액을 산출할 때 이 값을 사용합니다. 소수점 반올림 차이가 누적되면 수백 건의 거래에서 세무 보고 차이를 만들 수 있으므로 정밀도가 중요합니다.


제조: BOM(자재명세서) 수량

제조 모듈에서 구성품 수량은 Float입니다. 레시피에 0.75리터나 2.5kg처럼 소수점 수량이 필요할 때 Float가 자연스럽게 작동합니다. 정수 필드를 쓰면 생산 중 반올림 오류가 발생해 누적된 품질 문제로 이어질 수 있습니다.


구매: 가격 인자와 공급사 마진

공급사 가격정책이나 마크업 규칙에서 배수나 마진을 Float로 저장합니다. 예를 들어 1.25(25% 마크업) 또는 0.85(15% 할인) 같은 값이 구매 주문의 자동 가격 계산에 사용됩니다.

Float 필드 생성 및 커스터마이즈 방법


Float 필드를 추가하는 방법은 기술 환경에 따라 세 가지가 대표적입니다.

Odoo Studio(노코드) 사용

Odoo Studio는 내장된 로우코드 도구입니다. 코드 작성 없이 Float 필드를 추가하려면 다음 절차를 따릅니다.


  1. 메인 메뉴에서 Odoo Studio를 엽니다.
  2. 필드를 추가하려는 폼으로 이동합니다.
  3. 필드 선택기에서 '소수(Decimal Number)'를 폼으로 드래그합니다.
  4. 속성 패널에서 레이블, 기본값, 소수 자릿수를 설정합니다.
  5. 저장하고 Studio를 닫습니다.

Studio는 필드에 x_studio_ 접두사를 붙여 저장하고 폼 뷰에 자동으로 추가합니다. 데이터베이스 작업은 Odoo가 처리하므로 사용자는 기술 지식 없이도 필드를 만들 수 있습니다.


커스텀 모듈에서 Python 사용

개발자가 모듈을 만들 때는 Python에서 직접 Float 필드를 정의합니다. 버전관리와 배포를 고려한 표준 방법입니다.


from odoo import fields, models

class ResPartner(models.Model):
    _inherit = 'res.partner'

    x_credit_limit = fields.Float(
        string='Credit Limit',
        digits=(12, 2),
        default=0.0,
        help='Maximum outstanding balance allowed for this customer.',
    )

모델에 필드를 추가한 뒤에는 관련 뷰 XML에 포함시켜 UI에 보이게 합니다. 모듈 설치·업그레이드 시 Odoo가 DB 컬럼을 자동으로 처리합니다. 대규모 커스터마이징에는 이 방식이 권장됩니다.


XML-RPC API를 통한 생성

배포 스크립트나 원격 구성 자동화에서 Odoo API를 통해 필드를 생성할 수도 있습니다.

field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_custom_coefficient',
        'field_description': 'Custom Coefficient',
        'model_id': model_id,
        'ttype': 'float',
        'state': 'manual',
    }]
)

state='manual'은 해당 필드가 모듈이 아닌 수작업(Studio나 API)으로 생성되었음을 표시합니다. API로 만든 필드의 소수점 정밀도는 기술 메뉴의 소수점 정밀도 설정으로 관리됩니다. 자동화된 환경에서 원격으로 필드를 만들 때 유용한 접근법입니다.

모범 사례


권장 습관 — 이름있는 정밀도 그룹 사용

digits=(6, 2)처럼 하드코딩하지 말고 'Product Price'나 'Product Unit of Measure' 같은 정밀도 그룹을 참조하세요. 이렇게 하면 UI에서 정밀도를 일괄 관리할 수 있고, 해당 컨텍스트의 네이티브 필드와 정밀도를 일치시킬 수 있습니다.


권장 습관 — 화폐 금액이면 Monetary 사용

가장 중요한 지침 중 하나는 화폐 금액에는 반드시 Monetary 필드를 쓰라는 것입니다. Monetary는 같은 모델의 통화 필드와 연동돼 통화별 반올림 규칙과 다중통화 보고를 올바르게 처리합니다. Float로 금액을 처리하면 다중통화 환경에서 합계와 보고서가 틀어질 위험이 큽니다.


권장 습관 — 항상 기본값 설정

숫자 필드는 default=0.0으로 두는 것이 안전합니다. 기본값이 없으면 필드는 값이 없다는 의미의 False가 되어 계산식이나 Python 메서드에서 예외를 일으킬 수 있습니다.


권장 습관 — 보고용 group_operator 설정

수량·금액처럼 합계가 의미 있는 필드는 group_operator='sum'을, 비율처럼 평균이 더 적절한 필드는 'avg'를 설정하세요. 피벗·그래프에서 적절한 집계가 되도록 해두면 분석 품질이 좋아집니다.


권장 습관 — 퍼센트 규약 문서화

퍼센트 값을 저장할 때 0–100인지(예: 15.0 = 15%) 아니면 0–1인지(예: 0.15 = 15%) 규칙을 명시적으로 문서화하세요. 모델 전체에서 기준이 섞이면 추적하기 힘든 계산 오류가 발생합니다.


자주 발생하는 실수들


화폐 금액에 Float 사용 금지

Float 필드는 통화 정보를 담지 않으므로 1500이라는 값이 유로인지 달러인지 알 수 없습니다. 다중통화 환경에서는 재무 합계가 잘못될 수 있으니 통화가 연관된 값은 반드시 Monetary 타입을 사용하세요.


digits를 설정하지 않은 경우

digits를 명시하지 않으면 Odoo는 기본적으로 소수 둘째 자리(2자리)를 적용합니다. 가격에는 적합할 수 있지만 환율이나 단위 환산처럼 더 많은 소수가 필요한 필드엔 적합하지 않습니다. 예컨대 환산계수를 소수 둘째 자리로만 반올림하면 모든 거래에서 누적 오차를 만들 수 있습니다.


Python에서 ==로 Float 비교하기

부동소수점 연산 특성 때문에 겉보기로 같은 값도 == 비교가 False가 될 수 있습니다(예: 0.1 + 0.2 == 0.3는 False). odoo.tools.float_utils의 float_compare(value1, value2, precision_digits=2)와 float_is_zero(value, precision_digits=2)를 사용해 정밀도를 고려한 비교를 하세요.


정수만 필요한 자리엔 Integer 사용

항상 정수만 저장되는 필드(건수, 패키지 수, 시퀀스 번호 등)는 Integer 타입을 사용하세요. Float를 쓰면 소수 입력이 허용돼 혼동을 부르고 비즈니스 규칙 위반을 초래할 수 있습니다.


compute 메서드에서 False 값 처리하지 않음

기본값이 없는 Float 필드는 값이 없을 때 False를 반환합니다. 계산 메서드에서 연산 전에 False를 체크하지 않거나 default=0.0을 지정하지 않으면 TypeError가 발생할 수 있으니 방어 코드를 넣으세요.

맺음말


요약: Float는 핵심 요소


Float 필드는 가격·수량·비율·치수 등 소수점을 필요로 하는 값을 안정적으로 다루는 Odoo 데이터 모델의 핵심 구성요소입니다. 올바른 정밀도와 기본값을 설정하면 신뢰할 수 있는 결과를 얻을 수 있습니다.

주요 유의 사항을 정리하면: 표준 항목은 이름있는 정밀도 그룹을 사용하고, 통화 금액은 Monetary로 처리하며, 기본값을 항상 설정하고, 퍼센트 규약을 문서화하세요. 이 습관들만 지켜도 운영 중 발생하는 데이터 문제의 상당 부분을 예방할 수 있습니다.

Dasolo는 여러 부서에 걸쳐 Odoo를 설계·커스터마이즈·최적화하는 일을 돕습니다. 데이터 모델 설계, 폼에 맞춤 필드 추가, 또는 모듈을 처음부터 개발하는 작업까지 지원합니다. 문의하기 귀사의 Odoo 프로젝트에 대해 이야기 나눠보겠습니다.

Odoo Float Field 완전 정복 가이드
Dasolo 2026년 3월 6일
이 게시물 공유하기
로그인 의견을 남기기