Vâng, tôi thích MONEY! Đó là một byte rẻ hơn DECIMALvà các tính toán thực hiện nhanh hơn bởi vì (dưới vỏ bọc) các phép toán cộng và trừ về cơ bản là các phép toán số nguyên. Ví dụ của SQLMenace là một cảnh báo tuyệt vời cho việc không biết rằng có thể áp dụng tương tự cho các INTví dụ, trong đó kết quả sẽ bằng không. Nhưng đó không phải là lý do để không sử dụng số nguyên mà phù hợp .
Vì vậy, nó hoàn toàn 'an toàn' và phù hợp để sử dụng MONEYkhi những gì bạn đang giải quyết MONEYvà sử dụng nó theo các quy tắc toán học mà nó tuân theo (giống như INTeger).
Sẽ tốt hơn nếu SQL Server thúc đẩy sự phân chia và nhân của MONEYs thành DECIMAL(hoặc FLOATs?) - có thể, nhưng họ đã không chọn làm điều này; họ cũng không chọn quảng bá INTcho người khác đến FLOATs khi chia chúng.
MONEYkhông có vấn đề chính xác; việc DECIMALcó một loại trung gian lớn hơn được sử dụng trong quá trình tính toán chỉ là một 'tính năng' của việc sử dụng loại đó (và tôi thực sự không chắc chắn rằng 'tính năng' đó kéo dài bao xa).
Để trả lời câu hỏi cụ thể, một "lý do thuyết phục"? Chà, nếu bạn muốn hiệu suất tối đa tuyệt đối ở một SUM(x)nơi xcó thể DECIMALhoặc MONEY, thì MONEYsẽ có lợi thế.
Ngoài ra, đừng quên người anh em họ nhỏ hơn, điều SMALLMONEYchỉnh 4 byte, nhưng nó tối đa hóa ở mức 214,748.3647- khá nhỏ đối với tiền ăn tiền và vì vậy thường không phù hợp.
Để chứng minh điểm xung quanh bằng cách sử dụng các loại trung gian lớn hơn, nếu bạn chỉ định rõ ràng trung gian cho một biến, thì cũng DECIMALgặp phải vấn đề tương tự:
declare @a decimal(19,4)
declare @b decimal(19,4)
declare @c decimal(19,4)
declare @d decimal(19,4)
select @a = 100, @b = 339, @c = 10000
set @d = @a/@b
set @d = @d*@c
select @d
Sản xuất 2950.0000(được, vì vậy, ít nhất là DECIMALđược làm tròn chứ không phải MONEYcắt ngắn giống như một số nguyên.)
DECIMAL(19, 4)là một lựa chọn phổ biến, kiểm tra cái này cũng kiểm tra ở đây Định dạng tiền tệ thế giới để quyết định sử dụng bao nhiêu số thập phân, hy vọng sẽ giúp.