Sự khác biệt giữa số, dấu phẩy và số thập phân trong SQL Server


322

Sự khác nhau giữa là gì numeric, floatdecimalkiể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?


1
Liên kết thập phân và số ở trên cần cập nhật lên docs.microsoft.com/en-us/sql/t-sql/data-types/ . Các liên kết ở trên không còn tồn tại.
Nigel Ainscoe

1
Thông thường, khi giao dịch với các đối tượng tài chính, thật thú vị khi làm việc với các loại Số nguyên , ngoài các loại Dấu phẩy động và lưu trữ các giá trị dưới dạng xu , thay vì đô la , chẳng hạn.
Pedro

Câu trả lời:


494

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

  • số = thập phân (5 đến 17 byte) ( Chính xác Kiểu dữ liệu số )
    • sẽ ánh xạ tới số thập phân trong .NET
    • cả hai đều có (18, 0) làm tham số mặc định (độ chính xác, tỷ lệ) trong máy chủ SQL
    • scale = số chữ số thập phân tối đa có thể được lưu trữ ở bên phải dấu thập phân.
    • vui lòng lưu ý rằng tiền (8 byte) và smallmoney (4 byte) cũng chính xác và ánh xạ tới Decimal In .NET và có 4 điểm thập phân ( MSDN )
    • số thập phân và số (Transact-SQL) - MSDN
  • real (4 byte) ( Kiểu dữ liệu số gần đúng )
  • float (8 byte) ( Kiểu dữ liệu số gần đúng )
    • sẽ ánh xạ tới Double in .NET
  • Tất cả các loại số chính xác luôn tạo ra cùng một kết quả, bất kể loại kiến ​​trúc bộ xử lý nào đang được sử dụng hay độ lớn của các số
  • Tham số cung cấp cho các kiểu dữ liệu float xác định số bit được sử dụng để lưu trữ các mantissa số dấu chấm động .
  • Kiểu dữ liệu số gần đúng thường sử dụng ít bộ nhớ hơn và có tốc độ tốt hơn (tối đa 20 lần) và bạn cũng nên xem xét khi chúng được chuyển đổi trong .NET

Các kiểu dữ liệu số chính xác Các kiểu dữ liệu số gần đúng

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


17
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 đủ?
Sinh ra ToCode

7
thực tế là ít chính xác hơn vì vậy không được khuyến khích trừ khi lưu trữ số lớn hơn số thập phân (> 10e38) là cần thiết hoặc cân nhắc không gian. Tôi đoán độ chính xác ở đây trong trích dẫn có nghĩa là các giá trị có thể và độ lớn không chính xác
Iman

12
@BornToCode "độ chính xác" ở đây đề cập đến mức độ rộng của các giá trị bạn muốn lưu trữ. nếu bạn cần lưu trữ các giá trị trong khoảng từ 1e10 đến 1e-10, thì decimalsẽ ổ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 decimallĩ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.
Bacon Bits

Tôi thứ ba nhận xét của BornToCode và Iman. Tôi mới thử nghiệm (sử dụng SQL Server 2012) và có vẻ như máy epsilon cho float (53), loại dấu phẩy động có độ chính xác cao nhất, là 2.22044604925031E-16. Vì vậy, bạn sẽ nhận được khoảng 15 con số quan trọng trong số đó. Mặt khác, tôi có thể nhận được 38 con số đáng kể trong số thập phân.
Stewart

"Sử dụng float..." - nói ai? Đó là một trích dẫn hay ý kiến ​​của bạn?
dùng443854

24

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.


Số thập phân (cố định) được chỉ định trong Scalecột.
Cees Timmerman

1
Nếu bạn muốn 'chính xác như được chỉ định' thì, từ quan điểm tiêu chuẩn, có một số lợi thế numericvì 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
Ed Avis

13

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

http://sqlblog.com/bloss/alexander_kuznetsov/archive/2008/12/20/for-better-precision-cast-decimals-b Before-calculations.aspx


2
Nó không có ý nghĩa. Tất cả các câu trả lời khác, với các nguồn, nói rằng các kiểu dữ liệu số hoặc thập phân là chính xác và các kiểu float hoặc thực là một xấp xỉ rất gần nhau. Do độ chính xác thấp hơn, tôi có thể hiểu rằng việc đúc để nổi có thể cho phép tính toán nhanh hơn, nhưng độ chính xác không cao hơn.
cbaldan

3
Tất cả các loại dữ liệu số có thể gặp phải tràn và tràn. Overflow là một lỗi rõ ràng, tuy nhiên, underflow là im lặng. Các đặc điểm của underflow cho decimalfloatkhá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 .
ErikE

13

Chúng khác nhau về loại dữ liệu ưu tiên

DecimalNumeric đề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:

Liên kết tham khảo


7

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.


Bạn đã không chỉ định cái nào thích hợp hơn trong khi trường hợp giao dịch tài chính và tại sao?
Priyanka.sarkar

Đối với SQL Server 2008 trở lên, float (53) aka float là số dấu phẩy động có độ chính xác kép (64 bit), trong khi float (24) aka real là số dấu phẩy động có độ chính xác đơn (32 bit). docs.microsoft.com/en-us/sql/t-sql/data-types/float-and-real-transact-sql
M Kloster

4

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.

Tham khảo 1 2 3


3

Trường hợp cho số thập phâ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, DECIMALtrong hầu hết các cơ sở dữ liệu.


1

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?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.