Python SQLite의 재무 계산을 위해 부동 유형의 반올림 오류를 처리하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1801307

  •  05-07-2019
  •  | 
  •  

문제

나는 금융 앱을 만들고 있는데 Sqlite의 부유물이 떠 다니는 것 같습니다. 때로는 4.0이 4.000009이고 6.0은 6.00006이 될 것입니다. 이것을보다 정확하게 만들고 재무 계산에 영향을 미치지 않습니까?

그것이 중요하다면 값은 파이썬에서 나옵니다. 엉망인 숫자가 어느 영역에서 나오는지 확실하지 않습니다.

도움이 되었습니까?

해결책

이것은 통화 유형이 없기 때문에 sqlite를 사용하는 일반적인 문제입니다.
S.Mark가 말했듯이 소수 표현 라이브러리. 그러나 SQLITE 3은 이진 부동물 포인트 번호 (sqlite type real) 만 지원하므로 소수점 인코딩 된 플로트를 텍스트 또는 블로브로 보관하거나 실제로 변환해야합니다 (그러나 64 비트 바이너리 플로트로 돌아갑니다).
따라서 표현 해야하는 숫자 범위와 데이터베이스 내에서 계산을 수행 할 수 있는지 여부를 고려하십시오.

숫자 유형을 지원하는 다른 DB를 사용하는 것이 더 나을 수 있습니다. MySQL, PostgreSQL, 파이어 버드

다른 팁

소수점을 사용하십시오

http://docs.python.org/library/decimal.html

이것이 재무 응용 프로그램이라는 것을보고 만약에 소수점 이하 3 개 자리 만 계산할 수 있으며 모든 데이터를 내부적으로 정수로 저장할 수 있으며 프리젠 테이션 목적으로 플로트로만 변환 할 수 있습니다.

예를 들어

6.00 -> 600
4.35 -> 435

대부분의 사람들은 아마도 이것을 위해 소수점을 사용할 것입니다. 그러나 이것이 데이터베이스 유형에 맵핑되지 않으면 성능을 누릴 수 있습니다.

성능이 중요하다면 정수를 사용하여 적절한 통화 장치를 나타내는 것을 고려할 수 있습니다. 종종 센트 또는 10 센트의 센트는 괜찮습니다.

다양한 상황에서 금액을 반올림하는 방법에 대한 비즈니스 규칙이 있어야하며 각 시나리오를 다루는 테스트가 있어야합니다.

사용 소수 수치를 조작하기 위해 사용하십시오 간물 숫자 유형을 처리하지 않기 때문에 저장하고 sqlite에서 텍스트로로드하려면 텍스트로로드하십시오.

최종, 사용 단원 그리고 DocTest, 재무 운영의 경우, 모든 코드가 모든 회로에서해야 할 일을 수행하는지 확인하려고합니다. 소셜 네트워크와 같은 길에 버그를 고칠 수 없습니다 ...

소수점 번호를 사용해야합니다. 소수점 숫자는 정확히 표현 될 수 있습니다.

소수점 떠 다니는 지점에서 0.1 + 0.1 + 0.1 - 0.3 정확히 0과 같습니다. 바이너리 플로팅 포인트에서는 결과가 있습니다 5.5511151231257827e-017.

따라서 소수점을 시도하십시오.

import decimal
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top