Sự khác nhau giữa là gì numeric
, float
và decimal
kiểu dữ liệu và cần được sử dụng trong các tình huống đó?
Đối với bất kỳ loại giao dịch tài chính nào (ví dụ cho lĩnh vực tiền lương), loại nào được ưa thích và tại sao?
Sự khác nhau giữa là gì numeric
, float
và decimal
kiểu dữ liệu và cần được sử dụng trong các tình huống đó?
Đối với bất kỳ loại giao dịch tài chính nào (ví dụ cho lĩnh vực tiền lương), loại nào được ưa thích và tại sao?
Câu trả lời:
chỉ sử dụng kiểu float hoặc dữ liệu thực nếu độ chính xác được cung cấp theo số thập phân (tối đa 38 chữ số) là không đủ
Các kiểu dữ liệu số gần đúng không lưu trữ các giá trị chính xác được chỉ định cho nhiều số; họ lưu trữ một xấp xỉ cực kỳ gần đúng của giá trị. ( Technet )
Tránh sử dụng các cột float hoặc cột thực trong các điều kiện tìm kiếm mệnh đề WHERE, đặc biệt là các toán tử = và <> ( Technet )
nói chung vì độ chính xác được cung cấp bởi số thập phân là [10E38 ~ 38 chữ số] nếu số của bạn có thể vừa với nó và không gian lưu trữ nhỏ hơn (và có thể là tốc độ) của Float không quan trọng và xử lý các hành vi bất thường và các vấn đề về loại số gần đúng không chấp nhận được, sử dụng thập phân nói chung .
thông tin hữu ích hơn
Nguồn chính : Bộ công cụ đào tạo tự nhịp độ MCTS (Bài kiểm tra 70-433): Phát triển cơ sở dữ liệu Microsoft® SQL Server® 2008 - Chương 3 - Bảng, kiểu dữ liệu và tính toàn vẹn dữ liệu khai báo Bài 1 - Chọn kiểu dữ liệu (Nguyên tắc) - Trang 93
use the float or real data types only if the precision provided by decimal is insufficient
- Tôi nghĩ thực tế là ÍT chính xác sau đó là số thập phân, vậy tại sao bạn viết để sử dụng thực nếu số thập phân không đủ?
decimal
sẽ ổn thôi. Đó là độ chính xác 20. Nếu bạn cần lưu trữ các giá trị giữa, giả sử, 1e20 và 1e-20, tốt, decimal
không thể làm điều đó. Đó là 40 chữ số chính xác. Bạn không thể lưu trữ 1e20 và 1e-20 trong cùng một decimal
lĩnh vực. Thay vào đó, bạn có thể sử dụng float
, lưu trữ nội bộ mọi thứ dưới dạng nhật ký của cơ sở 2. Điều đó cho phép phạm vi chính xác đầy đủ trong một trường với nhược điểm là chỉ có 8 chữ số đầu tiên là chính xác.
float
..." - nói ai? Đó là một trích dẫn hay ý kiến của bạn?
Nguyên tắc từ MSDN: Sử dụng dữ liệu thập phân, thả nổi và dữ liệu thực
Độ chính xác tối đa mặc định của các loại dữ liệu số và số thập phân là 38. Trong Transact-SQL, số có chức năng tương đương với loại dữ liệu thập phân. Sử dụng kiểu dữ liệu thập phân để lưu trữ số có số thập phân khi các giá trị dữ liệu phải được lưu trữ chính xác theo quy định.
Hành vi của float và real tuân theo đặc tả của IEEE 754 về các kiểu dữ liệu số gần đúng. Do tính chất gần đúng của kiểu dữ liệu thực và dữ liệu thực, không sử dụng các loại dữ liệu này khi hành vi số chính xác được yêu cầu, chẳng hạn như trong các ứng dụng tài chính, trong các hoạt động liên quan đến làm tròn hoặc kiểm tra đẳng thức. Thay vào đó, hãy sử dụng các kiểu dữ liệu số nguyên, thập phân, tiền hoặc smallmoney. Tránh sử dụng cột float hoặc cột thực trong điều kiện tìm kiếm mệnh đề WHERE, đặc biệt là các toán tử = và <>. Tốt nhất là giới hạn các cột nổi và cột thực> hoặc <so sánh.
Scale
cột.
numeric
vì nó sẽ không bao giờ lưu trữ với độ chính xác cao hơn bạn yêu cầu: xem stackoverflow.com/a/759606/626804
Không phải là một câu trả lời đầy đủ, nhưng một liên kết hữu ích:
"Tôi thường xuyên thực hiện các phép tính dựa trên các giá trị thập phân. Trong một số trường hợp, việc truyền các giá trị thập phân để nổi ASAP, trước bất kỳ phép tính nào, mang lại độ chính xác tốt hơn."
decimal
và float
là khác nhau . Bảo toàn thập phân chống lại dòng chảy càng nhiều càng tốt bằng cách tăng độ chính xác hoặc tỷ lệ. Tuy nhiên, một khi bạn đạt đến giới hạn của các chữ số có nghĩa là số thập phân, dòng chảy bên dưới sẽ im lặng (và độ chính xác bị mất). Float có phạm vi quy mô rộng hơn có thể, và đó là giới hạn quy mô thực sự là nguyên nhân của dòng chảy. Như vậy, phao có thể có quy mô tốt hơn. Tuy nhiên, nó vẫn là một loại không chính xác .
Decimal và Numeric đều giống nhau về mặt chức năng nhưng vẫn còn là kiểu dữ liệu được ưu tiên , có thể là rất quan trọng trong một số trường hợp.
SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')
Kiểu dữ liệu kết quả là số vì nó được ưu tiên kiểu dữ liệu .
Danh sách đầy đủ các loại dữ liệu theo quyền ưu tiên:
Decimal có độ chính xác cố định trong khi float có độ chính xác thay đổi.
EDIT (không thể đọc toàn bộ câu hỏi): Float (53) (còn gọi là thực) là số dấu phẩy động có độ chính xác kép (32 bit) trong SQL Server. Float thường là một số dấu phẩy động chính xác duy nhất. Double là sự kết hợp tốt giữa độ chính xác và đơn giản cho rất nhiều phép tính. Bạn có thể tạo một số chính xác rất cao với số thập phân - lên tới 136-bit - nhưng bạn cũng phải cẩn thận rằng bạn xác định chính xác và chia tỷ lệ chính xác để nó có thể chứa tất cả các phép tính trung gian của bạn đến số chữ số cần thiết.
Float là kiểu dữ liệu số xấp xỉ, có nghĩa là không phải tất cả các giá trị trong phạm vi loại dữ liệu có thể được biểu diễn chính xác.
Số thập phân / Số là loại dữ liệu Cố định-Chính xác, có nghĩa là tất cả các giá trị trong phạm vi loại dữ liệu có thể được biểu diễn chính xác với độ chính xác và tỷ lệ. Bạn có thể sử dụng số thập phân để tiết kiệm tiền.
Chuyển đổi từ số thập phân hoặc số thành số nổi có thể gây ra một số mất độ chính xác. Đối với các kiểu dữ liệu Thập phân hoặc Số, SQL Server coi mỗi kết hợp cụ thể của độ chính xác và tỷ lệ là một loại dữ liệu khác nhau. DECIMAL (2,2) và DECIMAL (2,4) là các loại dữ liệu khác nhau. Điều này có nghĩa là 11,22 và 11,2222 là các loại khác nhau mặc dù đây không phải là trường hợp nổi. Đối với FLOAT (6) 11,22 và 11,2222 là cùng loại dữ liệu.
Bạn cũng có thể sử dụng loại dữ liệu tiền để tiết kiệm tiền. Đây là kiểu dữ liệu gốc với 4 chữ số chính xác. Hầu hết các chuyên gia thích loại dữ liệu này để tiết kiệm tiền.
Những gì nó cần cơ bản?
Nó phát sinh từ thực tế là, cuối cùng, máy tính đại diện, bên trong, các số ở định dạng nhị phân. Điều đó dẫn đến các lỗi làm tròn.
Xem xét điều này:
0.1 (decimal, or "base 10") = .00011001100110011... (binary, or "base 2")
Dấu chấm lửng ở trên [...] có nghĩa là 'vô hạn'. Nếu bạn xem xét nó một cách cẩn thận, có một mẫu lặp lại vô hạn (= '0011')
Vì vậy, đến một lúc nào đó máy tính phải làm tròn giá trị đó. Điều này dẫn đến các lỗi tích lũy xuất phát từ việc sử dụng lặp lại các số được lưu trữ không chính xác.
Giả sử bạn muốn lưu trữ số tiền tài chính (là những con số có thể có một phần phân số). Trước hết, rõ ràng bạn không thể sử dụng số nguyên (số nguyên không có phần phân số). Từ quan điểm toán học thuần túy, xu hướng tự nhiên sẽ là sử dụng a float
. Nhưng, trong một máy tính, phao có một phần của một số được đặt sau dấu thập phân - "mantissa" - bị giới hạn. Điều đó dẫn đến lỗi làm tròn số.
Để khắc phục điều này, máy tính cung cấp các kiểu dữ liệu cụ thể nhằm hạn chế lỗi làm tròn nhị phân trong máy tính cho các số thập phân. Đây là loại dữ liệu hoàn toàn nên được sử dụng để đại diện cho số tiền tài chính. Những kiểu dữ liệu này thường đi theo tên của Decimal
. Đó là trường hợp trong C #, ví dụ. Hoặc, DECIMAL
trong hầu hết các cơ sở dữ liệu.
Mặc dù câu hỏi không bao gồm loại dữ liệu TIỀN, một số người gặp chủ đề này có thể bị cám dỗ sử dụng loại dữ liệu TIỀN để tính toán tài chính.
Hãy cảnh giác với kiểu dữ liệu TIỀN, nó có độ chính xác hạn chế.
Có rất nhiều thông tin tốt về nó trong câu trả lời cho câu hỏi Stackoverflow này:
Bạn nên chọn các kiểu dữ liệu TIỀN hoặc DECIMAL (x, y) trong SQL Server?