2010-07-16 72 views
11

Tôi đang xử lý nhiều đơn vị tiền tệ khác nhau trong đơn đăng ký của mình và tôi muốn biết cách "tốt nhất" là lưu trữ chúng trong cơ sở dữ liệu SQLite3.Lưu trữ các giá trị tiền tệ trong SQLite3

Tôi đang hướng tới đại diện điểm cố định (ví dụ: lưu trữ chúng dưới dạng số nguyên, trong đó $ 3.59 được lưu trữ là 359, ¥ 400 được lưu trữ là 40000). Đây có phải là một ý tưởng tốt? Điều gì xảy ra nếu dữ liệu đầu vào của tôi sau đó thay đổi và đòi hỏi độ chính xác cao hơn?

Trả lời

18

Cho rằng SQLite 3 sẽ sử dụng tối đa 8 byte để lưu trữ các loại INTEGER, trừ khi bạn sắp có số lớn hơn 10^16, bạn nên ổn.

Để đặt điều này theo quan điểm, tổng sản phẩm quốc nội trên thế giới được biểu thị bằng phần nghìn USD (một nhà máy) là khoảng 61'000'000'000'000'000 mà sqlite3 không có vấn đề gì.

sqlite> create table gdp (planet string, mills integer); 
sqlite> insert into gdp (planet, mills) values ('earth', 61000000000000000000); 
sqlite> select * from gdp; 
earth|61000000000000000000 

Trừ khi bạn đang xử lý kế toán liên hành tinh, tôi không nghĩ bạn phải lo lắng.

+1

Bạn phải tính đến tất cả các khả năng ... ;-) Cảm ơn! – nornagon

+10

Vâng, để hoàn toàn chính xác, điều này không giải thích cho tất cả các trường hợp: http://en.wikipedia.org/wiki/File%3AZimbabwe_%24100_trillion_2009_Obverse.jpg – msw

0

Tôi muốn nói chuỗi/văn bản. Bạn luôn có thể chuyển đổi nó thành bất kỳ nền văn hóa nào nếu bạn cần làm điều đó.

+3

Lưu trữ dữ liệu số dưới dạng chuỗi là ngớ ngẩn, đặc biệt khi có loại số hoàn toàn tốt hỗ trợ trường hợp sử dụng. –

1

Trong đơn vị tiền tệ phần mềm tài chính luôn được biểu diễn dưới dạng điểm cố định (thập phân). Bạn có thể mô phỏng nó trong SQLite bằng cách sử dụng số nguyên (số nguyên 64 bit chứa tối đa 18 chữ số).

0

DataType tệ tốt nhất là BigDecimal và trong sqlite bạn có thể lưu nó như là một lĩnh vực VARCHAR

ormlite chuyển đổi BigDecimal chuỗi khi bạn lưu nó.

ormlite doc for BigDecimal

-3

SQLite không có trường BigDecimal Vì vậy, tôi sử dụng các loại SQLite Integer và chuyển đổi như sau: BigDecimal bd = BigDecimal mới ("1234,5678"); int packedInt = bd.scaleByPowerOfTen (4) .intValue(); // packedInt now = 12345678 Bây giờ hãy lưu đóng góiTôi vào trường Số nguyên SQLite. Để quay lại BigDecimal: BigDecimal bd = new BigDecimal (packedInt); // bd = 12345678 bd = bd.scaleByPowerOfTen (-4); // now bd = 1234.5678

+0

Vui lòng không đăng [câu trả lời giống hệt] (http://stackoverflow.com/a/39626427/5292302) cho nhiều câu hỏi. Đăng một câu trả lời hay, sau đó bỏ phiếu/gắn cờ để đóng các câu hỏi khác dưới dạng bản sao. Nếu câu hỏi không trùng lặp, hãy * điều chỉnh câu trả lời của bạn cho câu hỏi. * –

Các vấn đề liên quan