Có vẻ như Money
loại được khuyến khích như được mô tả ở đây
Ứng dụng của tôi cần lưu trữ tiền tệ, tôi sẽ sử dụng loại dữ liệu nào? Số, tiền hay FLOAT?
Có vẻ như Money
loại được khuyến khích như được mô tả ở đây
Ứng dụng của tôi cần lưu trữ tiền tệ, tôi sẽ sử dụng loại dữ liệu nào? Số, tiền hay FLOAT?
Câu trả lời:
Số với độ chính xác 2 đơn vị. Không bao giờ sử dụng float hoặc float như datatype để đại diện cho tiền tệ bởi vì nếu bạn làm như vậy, mọi người sẽ không hài lòng khi số liệu cuối cùng của báo cáo tài chính không chính xác bằng + hoặc - một vài đô la.
Loại tiền chỉ còn lại vì những lý do lịch sử theo như tôi có thể nói.
scale - precision
numeric(3,2)
sẽ có thể lưu trữ tối đa9.99
3-2 = 1
Nguồn của bạn là không có cách nào chính thức. Nó có từ năm 2011 và tôi thậm chí không nhận ra các tác giả. Nếu loại tiền chính thức "nản lòng" thì PostgreSQL sẽ nói như vậy trong hướng dẫn - điều này không có .
Để có nguồn chính thức hơn , hãy đọc chủ đề này bằng pssql-general (chỉ từ tuần này!) , Với các tuyên bố từ các nhà phát triển cốt lõi bao gồm D'Arcy JM Cain (tác giả ban đầu của loại tiền) và Tom Lane:
Câu trả lời liên quan (và ý kiến!) Về những cải tiến trong các phiên bản gần đây:
Về cơ bản, money
có công dụng (rất hạn chế) của nó. Các Postgres Wiki gợi ý cho phần lớn tránh nó, ngoại trừ đối với những số ít trường hợp. Lợi thế hơn numeric
là hiệu suất .
decimal
chỉ là một bí danh cho numeric
Postgres và được sử dụng rộng rãi cho dữ liệu tiền tệ, là một loại "độ chính xác tùy ý". Hướng dẫn sử dụng :
Loại
numeric
có thể lưu trữ số với số lượng chữ số rất lớn. Đặc biệt khuyến nghị lưu trữ số tiền và số lượng khác khi cần độ chính xác.
Cá nhân, tôi thích lưu trữ tiền tệ như là integer
đại diện cho Cents nếu Cents phân đoạn không bao giờ xảy ra (về cơ bản là tiền có ý nghĩa). Đó là hiệu quả hơn bất kỳ tùy chọn khác được đề cập.
money
trên thực tế, loại này không được dùng nữa. Các vấn đề đã được khắc phục và loại đã được thêm lại trong các phiên bản sau. Cá nhân tôi thích lưu trữ tiền tệ như integer
đại diện cho Cents.
Lựa chọn của bạn là:
bigint
: lưu trữ số tiền tính bằng xu. Đây là những gì giao dịch EFTPOS sử dụng.decimal(12,2)
: lưu trữ số tiền với chính xác hai chữ số thập phân. Đây là những gì hầu hết các phần mềm sổ cái sử dụng.float
: ý tưởng khủng khiếp - độ chính xác không đầy đủ. Đây là những gì các nhà phát triển ngây thơ sử dụng.Tùy chọn 2 là phổ biến nhất và dễ làm việc nhất. Làm cho độ chính xác (12 trong ví dụ của tôi, có nghĩa là tất cả 12 chữ số) lớn hoặc nhỏ là phù hợp nhất với bạn.
Lưu ý rằng nếu bạn đang tổng hợp nhiều giao dịch là kết quả của phép tính (ví dụ: liên quan đến tỷ giá hối đoái) thành một giá trị có ý nghĩa kinh doanh, thì độ chính xác phải cao hơn để cung cấp giá trị vĩ mô chính xác; xem xét sử dụng một cái gì đó như thế decimal(18, 8)
để tổng là chính xác và các giá trị riêng lẻ có thể được làm tròn đến cent chính xác để hiển thị.
numeric(15,4)
hoặc numeric(15,6)
là một ý tưởng tốt.
Tôi giữ tất cả các lĩnh vực tiền tệ của mình như:
numeric(15,6)
Có vẻ như có quá nhiều vị trí thập phân, nhưng nếu có cơ hội nhỏ nhất bạn sẽ phải giao dịch với nhiều loại tiền tệ, bạn sẽ cần độ chính xác cao đó để chuyển đổi. Bất kể tôi đang trình bày người dùng là gì, tôi luôn lưu trữ bằng Đô la Mỹ. Bằng cách đó, tôi có thể dễ dàng chuyển đổi sang bất kỳ loại tiền tệ nào khác, với tỷ lệ chuyển đổi cho ngày liên quan.
Nếu bạn không bao giờ làm bất cứ điều gì ngoại trừ một loại tiền tệ, điều tồi tệ nhất ở đây là bạn đã lãng phí một chút không gian để lưu trữ một số số không.
bigint
Tôi khuyên bạn nên sử dụng đô la vi mô (hoặc tiền tệ chính tương tự). Micro có nghĩa là 1 triệu nên 1 micro-đô la = $ 0,000001.
numeric(15,6)
đề nghị trong một câu trả lời khác?
bigint
. Có developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ mẹo nhưng nó đi kèm với sự hỗ trợ hạn chế (hiện tại) và hãy cẩn thận (ví dụ: bạn không thể nhân nó một cách dễ dàng khi thực hiện chuyển đổi tiền tệ) . Cho rằng số tiền tối đa bạn có thể lưu trữ trong một số nguyên JS bằng cách sử dụng vi mô là 9 tỷ đô la, điều đó có lẽ vẫn tốt cho hầu hết các trường hợp.
Sử dụng BigInt
để lưu trữ tiền tệ dưới dạng số nguyên dương biểu thị giá trị tiền tệ theo đơn vị tiền tệ nhỏ nhất (ví dụ: 100 xu để lưu trữ $ 1 hoặc 100 để lưu trữ ¥ 100 (Yên Nhật, tiền tệ thập phân 0). Đây là những gì Stripe thực hiện - một các công ty dịch vụ tài chính quan trọng nhất cho thương mại điện tử toàn cầu.