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ệ.