2012-06-20 69 views
6

Tôi cần chuyển đổi Float sang thập phân (28,10) trong SQL Server. Vấn đề của tôi là do bản chất của phao, và cách thức chuyển đổi được thực hiện, chỉ cần đúc phao có thể làm cho nó có vẻ là số sai cho người dùng của tôi.Chuyển đổi Float sang thập phân (SQL Server)

Ví dụ:

Float:    280712929.22 
Cast as Decimal:  280712929.2200000300 
What I think I want: 280712929.2200000000 

Tôi hiểu một chút thông tin về hoạt động của phao chiều (mà nó là một kiểu dữ liệu xấp xỉ vv), nhưng phải thừa nhận là không đủ để hiểu tại sao nó thêm 300 ở cuối. Nó đơn giản là rác thải như là một tác dụng phụ của việc chuyển đổi, hoặc là nó bằng cách nào đó một đại diện chính xác hơn về những gì nổi thực sự lưu trữ? Đối với tôi, có vẻ như nó đã kéo chính xác ra khỏi không khí mỏng.

Cuối cùng, tôi cần nó chính xác, nhưng cũng phải nhìn "đúng". Tôi nghĩ rằng tôi cần phải có được số dưới cùng, như sau đó nó trông giống như tôi đã chỉ cần thêm dấu chân sau. Điều này có thể không? Đây có phải là một ý tưởng tốt hay xấu, và tại sao? Các đề xuất khác được hoan nghênh.

Một số ví dụ khác:

Float:   364322379.5731 
Cast as Decimal: 364322379.5730999700 
What I want:  364322379.5731000000 

Float:   10482308902 
Cast as Decimal: 10482308901.9999640000 
What I want:  10482308902.0000000000 

Side lưu ý: bảng cơ sở dữ liệu mới mà tôi đang đặt những giá trị này vào là có thể đọc được bởi người dùng của tôi. Họ thực sự chỉ cần hai chữ số thập phân ngay bây giờ, nhưng điều đó có thể thay đổi trong tương lai vì vậy chúng tôi đã quyết định đi với Thập phân (28,10). Mục tiêu dài hạn là chuyển đổi các cột nổi mà tôi cũng nhận được dữ liệu của tôi từ thập phân.

CHỈNH SỬA: Đôi khi các số nổi mà tôi có số thập phân nhiều hơn số tôi cần, ví dụ: -0.628475064730907. Trong trường hợp này, dàn diễn viên đến -0,6284750647 là tốt. Tôi về cơ bản cần kết quả của tôi để thêm zeroes vào cuối phao cho đến khi tôi có 10 chữ số thập phân.

+0

Có lẽ tôi tìm thấy câu trả lời. http://stackoverflow.com/questions/34316871/how-can-the-following-result-of-casting-from-float-to-numeric-be-explained –

Trả lời

8

Bạn cần phải cast một lần để tròn, và một lần để thêm chữ số thập phân trở lại (có nhiều cách khác nữa, chắc chắn, sử dụng STR, ROUND vv):

DECLARE @c TABLE(x FLOAT); 

INSERT @c SELECT 280712929.22; 
INSERT @c SELECT 364322379.5731; 
INSERT @c SELECT 10482308902; 

SELECT x, 
    d = CONVERT(DECIMAL(28,10), x), 
    rd = CONVERT(DECIMAL(28,10), CONVERT(DECIMAL(28,4), x)) 
FROM @c; 

Kết quả:

x    d      rd 
-------------- ---------------------- ---------------------- 
280712929.22 280712929.2200000300 280712929.2200000000 
364322379.5731 364322379.5730999700 364322379.5731000000 
10482308902  10482308902.0000000000 10482308902.0000000000 

Nếu bạn muốn nó chính xác và nhìn đúng, hãy ngừng sử dụng FLOAT, đây là loại dữ liệu gần đúng và bất chấp logic cho hầu hết mọi người bên ngoài nền toán học nghiêm ngặt. Sử dụng DECIMAL với quy mô lớn hơn mức bạn cần và định dạng số vị trí thập phân bạn cần ngay bây giờ (trong truy vấn của bạn hoặc tạo chế độ xem hoặc tạo cột được tính toán). Nếu bạn lưu trữ nhiều thông tin hơn mức bạn cần bây giờ, bạn luôn có thể hiển thị thêm sau. Bạn cũng có thể chọn không cấp cho người dùng quyền truy cập trực tiếp vào bảng của mình.

+0

số thập phân có thể khác nhau, ít nhất đó là những gì tôi nghĩ. –

+0

Điều đó giúp ích cho một mức độ.Tuy nhiên, điều đó có nghĩa là tôi sẽ cắt ngắn các chữ số của các phao nổi, nơi tôi thực sự có nhiều hơn 4 chữ số thập phân ở vị trí đầu tiên, tức là: 517822.18109027. Sẽ chỉnh sửa bài đăng để làm rõ. –

+2

Nếu bạn cần quyết định có bao nhiêu vị trí thập phân để hiển thị trên mỗi hàng, dựa trên giá trị trong hàng đó, tôi nghĩ bạn đang chuyển sang lãnh thổ phân tích cú pháp/định dạng chuỗi. Điều này có thể được thực hiện tốt nhất ở lớp trình bày, không phải trong cơ sở dữ liệu. –

1

Tôi không chắc liệu điều này có nằm trong việc necroposting hay không, nhưng gần đây tôi đã gặp vấn đề tương tự nên tôi nghĩ mình có thể đăng bài.

Điều này có thể xấu xí như tội lỗi, nhưng dường như hoạt động (được sửa đổi từ phản ứng của Aaron ở trên).

DECLARE @myTable TABLE(x FLOAT); 

INSERT INTO @myTable VALUES 
    (280712929.22), 
    (364322379.5731), 
    (10482308902), 
    (-0.628475064730907); 

SELECT x, 
     d = CONVERT(DECIMAL(28,10), x),     
     NewDec = CONVERT(DECIMAL(28,10),   
         CONVERT(DECIMAL(16,15), 
           LEFT(CONVERT(VARCHAR(50), x, 2),17)) 
         * POWER(CONVERT(DECIMAL(38,19),10), 
           RIGHT(CONVERT(varchar(50), x,2),4)))      
FROM @myTable; 

Kết quả:

x     d      NewDec 
------------------ ---------------------- ---------------------- 
280712929.22  280712929.2200000300 280712929.2200000000 
364322379.5731  364322379.5731000300 364322379.5731000000 
10482308902   10482308902.0000000000 10482308902.0000000000 
-0.628475064730907 -0.6284750647   -0.6284750647 
Các vấn đề liên quan