2009-06-29 70 views
219

Tôi đã tìm kiếm trong Google và cũng đã truy cập decimal and numericSQL Server Helper để thu thập sự khác biệt giữa các kiểu dữ liệu số, phao và số thập phân cũng như tìm ra cái nào nên được sử dụng trong tình huống nào.Sự khác biệt giữa số, float và số thập phân trong SQL Server

Đối với bất kỳ loại giao dịch tài chính nào (ví dụ: đối với trường tiền lương), giao dịch nào được ưu tiên và tại sao?

+0

Các liên kết số thập phân và số trên nhu cầu cập nhật lên https://docs.microsoft.com/en-us/sql/t-sql/data-types/decimal-and -numeric-transact-sql. Liên kết ở trên không còn tồn tại. –

+0

Thông thường, khi giao dịch với các đối tượng tài chính, điều thú vị là làm việc với các loại ** Integer **, ngoài ** Các điểm ** nổi và lưu trữ các giá trị dưới dạng _cents_, thay vì _dollars_, chẳng hạn. – Pedro

Trả lời

335

sử dụng các phao hoặc thực kiểu dữ liệu chỉ khi độ chính xác pr ovided bởi thập phân (lên đến 38 chữ số) là không đủ

  • xấp xỉ kiểu dữ liệu số không lưu trữ các giá trị chính xác theo quy định cho nhiều số; họ lưu trữ cực kỳ chặt chẽ xấp xỉ giá trị. (Technet)

  • Tránh sử dụng phao hoặc cột thực sự trong WHERE điều kiện tìm kiếm khoản, đặc biệt là = và <> nhà khai thác (Technet)

nên thường 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 loại số gần đúng không được chấp nhận, sử dụng Thập phân chung.

thông tin hữu ích hơn

  • số = thập phân (5-17 byte) (chính xác Numeric Data Type)
    • sẽ bản đồ để 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 SQL server
    • scale = số chữ số thập phân tối đa có thể được lưu ở bên phải dấu thập phân.
    • lòng lưu ý rằng tiền (8 byte) và smallmoney (4 byte) cũng là chính xác và bản đồ để thập phân trong .NET và có 4 điểm thập phân (MSDN)
    • decimal and numeric (Transact-SQL) - MSDN
  • thực (4 byte) (xấp xỉ Numeric Data Type)
  • float (8 byte) (xấp xỉ Numeric Data Type)
    • sẽ vạch để đôi trong .NET
  • Tất cả chính xác loại số luôn tạo ra cùng một kết quả , bất kể loại kiến ​​trúc bộ vi xử lý nào đang được sử dụng hoặc độ lớn của các số
  • Thông số được cung cấp cho kiểu dữ liệu phao xác định số lượng bit là được sử dụng để lưu trữ mantissa của số dấu phẩy động.
  • xấp xỉ Numeric Data Type thường sử dụng ít lưu trữ và có tốc độ tốt hơn (lên đến 20x) và bạn cũng nên cân nhắc khi họ đã chuyển đổi trong .NET

Exact Numeric Data Types Approximate Numeric Data Types

nguồn chính: MCTS Self-Paced Training Kit (Exam 70-433): Microsoft® SQL Server® 2008 Database Development - Chương 3 - Bàn, kiểu dữ liệu, và Declarative Data Integrity Bài 1 - Chọn kiểu dữ liệu (Hướng dẫn) - Trang 93

+11

'chỉ sử dụng phao hoặc các loại dữ liệu thực nếu độ chính xác được cung cấp bởi số thập phân là không đủ' - tôi nghĩ thực tế là LESS chính xác sau đó thập phân, do đó, u viết như thế nào để sử dụng nếu số thập phân không đủ? – BornToCode

+5

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

+5

@BornToCode Độ chính xác ở đây đề cập đến các giá trị bạn muốn lưu trữ bao nhiêu. nếu bạn cần lưu trữ các giá trị giữa 1e10 và 1e-10, thì 'decimal' sẽ là tốt. Đó là độ chính xác của 20. Nếu bạn cần lưu trữ các giá trị giữa, ví dụ: 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 bao giờ có thể lưu trữ 1e20 và 1e-20 trong cùng một trường 'thập phân '. 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ơ sở 2. Điều đó cho phép một phạm vi chính xác đầy đủ trong một trường có nhược điểm là chỉ 8 chữ số đầu tiên sẽ chính xác. –

7

Thập phân có độ chính xác cố định trong khi phao 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 chấm động (32 bit) chính xác kép trong SQL Server. Float thông thường là một số điểm nổi chính xác đơn. Double là một sự kết hợp tốt về độ chính xác và đơn giản cho rất nhiều tính toán. Bạn có thể tạo 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 khi xác định độ chính xác và 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 với số chữ số cần thiết.

+0

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

11

Không phải là một câu trả lời hoàn chỉnh, nhưng một liên kết hữu ích: ". Tôi thường xuyên làm các phép tính đối với giá trị thập phân Trong một số trường hợp đúc giá trị thập phân nổi càng sớm càng tốt, trước khi bất kỳ tính toán, mang lại độ chính xác tốt hơn"

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/12/20/for-better-precision-cast-decimals-before-calculations.aspx

+1

Điều này thực sự kỳ lạ. Nhưng nó hoạt động ... –

+1

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ỉ gần đúng. 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 không chính xác cao hơn. – cbaldan

+1

Tất cả các kiểu dữ liệu số có thể gặp phải tràn và tràn. Lỗi tràn là một lỗi rõ ràng, tuy nhiên, phần dưới là im lặng. Các đặc tính của dòng dưới cho 'decimal' và' float' là * khác nhau *. Decimal bảo tồ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 quy mô. Tuy nhiên, một khi bạn nhấn giới hạn các chữ số có nghĩa trong thập phân, dòng dưới là im lặng (và độ chính xác bị mất). Float có phạm vi rộng hơn về quy mô có thể, và đó là giới hạn quy mô mà thực sự là nguyên nhân của sự tràn. Do đó, 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

18

Hướng dẫn từ MSDN: Using decimal, float, and real Data

Độ chính xác tối đa mặc định của các kiểu dữ liệu số và thập phân là 38. Trong Transact-SQL, số là hàm tương đương với số thập phân kiểu dữ liệu. Sử dụng loại dữ liệu thập phân để lưu trữ số có số thập phân khi giá trị dữ liệu phải được lưu trữ chính xác như được chỉ định.

Hành vi của phao và thực tuân theo thông số IEEE 754 về các kiểu dữ liệu số gần đúng. Do tính chất gần đúng của phao và các kiểu dữ liệu thực, không sử dụng các kiểu dữ liệu này khi yêu cầu chính xác số , 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 bình đẳng. Thay vào đó, hãy sử dụng các loại dữ liệu số nguyên, thập phân, tiền hoặc smallmoney . Tránh sử dụng phao hoặc cột thực trong điều kiện tìm kiếm khoản WHERE, đặc biệt là toán tử = và <>. Tốt nhất là nên giới hạn các cột nổi và cột thực thành> hoặc < so sánh.

+0

Số thập phân (cố định) được xác định trong cột 'Quy mô'. –

+0

Nếu bạn muốn 'chính xác như được chỉ định' thì, từ một điểm tiêu chuẩn của xem, có một số lợi thế để 'số' 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 http://stackoverflow.com/a/ 759606/626804 –

9

Họ khác nhau về dữ liệu Loại Precedence

DecimalNumeric đều giống nhau về mặt chức năng nhưng vẫn còn dữ liệu loại ư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') 

Kết quả là kiểu dữ liệu là số vì phải mất dữ liệu loại ưu tiên.

danh sách đầy đủ các loại dữ liệu bằng cách ưu tiên:

Reference link

1

phao là xấp xỉ-số kiểu dữ liệu, có nghĩa là không phải tất cả các giá trị trong phạm vi kiểu dữ liệu có thể được biểu diễn một cách 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ừ Thập phân hoặc Số sang nổi có thể làm mất một số độ chính xác. Đối với kiểu dữ liệu thập phân hoặc số, SQL Server xem xét từng kết hợp cụ thể của độ chính xác và tỷ lệ như một kiểu dữ liệu khác nhau. DECIMAL (2,2) và DECIMAL (2,4) là các kiểu dữ liệu khác nhau. Điều này có nghĩa rằng 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 cho phao. Đối với FLOAT (6) 11.22 và 11.2222 là các loại dữ liệu giống nhau.

Bạn cũng có thể sử dụng tiền loại dữ liệu để tiết kiệm tiền. Đây là loại dữ liệu gốc có độ chính xác 4 chữ số. Hầu hết các chuyên gia thích loại dữ liệu này để tiết kiệm tiền.

Reference 1 2 3

Các vấn đề liên quan