Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tôi nên sử dụng kiểu dữ liệu nào để lưu trữ các giá trị tiền tệ?

Papuccino,

Tôi không khuyến khích các loại tiền và tiền nhỏ trừ khi bạn chắc chắn rằng số học duy nhất bạn định làm là cộng và trừ. Nếu bạn có thể đang xử lý tỷ giá hối đoái, tỷ lệ phần trăm, v.v., bạn có nguy cơ gặp phải các vấn đề thực sự với những loại này.

Đây chỉ là một ví dụ nhỏ để bạn thấy sự khác biệt giữa việc sử dụng tiền, số thập phân và số float khi có liên quan đến phép chia. Có thể đưa ra các ví dụ mà sự khác biệt còn ấn tượng hơn nhiều.

declare @m1 money, @m2 money, @m3 money
declare @d1 decimal(19,4), @d2 decimal(19,4), @d3 decimal(19,4)
declare @f1 float, @f2 float, @f3 float;
set @m1 = 1.00;
set @m2 = 345.00;
set @m3 = @m1/@m2;
set @d1 = 1.00;
set @d2 = 345.00;
set @d3 = @d1/@d2;
set @f1 = 1.00;
set @f2 = 345.00;
set @f3 = @f1/@f2;
select @m3, @d3, @f3;

Kết quả:0,0028 0,0029 0,00289855072463768

Tùy thuộc vào ngành, có thể có các hướng dẫn hoặc quy định để giúp bạn quyết định loại dữ liệu phù hợp. Không có câu trả lời đúng.

Nhận xét đã thêm:

Bạn đúng rằng tiền / tiền không nên là tiền, nhưng SQL Server (không thể giải thích được) tạo ra chính xác kết quả đó:nhập tiền từ thương số của hai giá trị tiền. Điều này là không có thật, nhưng như bạn thấy từ ví dụ bên dưới, đó là những gì bạn nhận được, mặc dù nó vô nghĩa:

declare @m1 money, @m2 money;
declare @d1 decimal(19,4), @d2 decimal(19,4);
set @m1 = 1.00;
set @m2 = 345.00;
set @d1 = 1.00;
set @d2 = 345.00;
select @m1/@m2, @d1/@d2

Kết quả:0,0028 0,0028985507246376811

Kết quả với loại tiền, 0,0028, nhỏ hơn 3-4% so với kết quả đúng.

Tất nhiên, có nhiều tình huống mà bạn cần phải phân chia các giá trị tiền tệ. Nguy hiểm của việc sử dụng loại tiền là thương số là loại sai (và một câu trả lời không đủ gần với một câu trả lời đúng). Ví dụ về các câu hỏi yêu cầu phân chia đơn vị tiền tệ:

Giả sử bạn đổi 320 Nhân dân tệ và ngân hàng chuyển cho bạn 47,3 Đô la Mỹ. Tỷ giá hối đoái bạn đã được cung cấp là bao nhiêu?

Giả sử bạn đầu tư 23 đô la và một năm sau số tiền đó trị giá 31 đô la. Tỷ lệ phần trăm lợi nhuận của bạn là bao nhiêu?

Cả hai phép tính này đều yêu cầu chia các giá trị tiền tệ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tính toán tương đương với SQL Server (băm ('SHA1', [ColumnName])) trong C #?

  2. Áp dụng mệnh đề Where cho Order by trong SQL

  3. Kiểm tra xem bảng có tồn tại trong SQL Server không

  4. Liệt kê tất cả các cột SQL có độ dài tối đa VÀ độ dài lớn nhất

  5. YEAR () Ví dụ trong SQL Server (T-SQL)