2011-11-11 25 views
7

Tôi có giá trị 1555.4899999999998 được lưu trữ trong cột float với độ chính xác mặc định (53). Khi tôi làm một đơn giản select, SSMS làm tròn đầu ra thay vì in nó với tất cả độ chính xác có sẵn. Nó gây ra một số gotchas cho tôi gần đây kể từ khi giá trị in không hoạt động như một float chữ để phù hợp với giá trị thực tế được lưu trữ.Đầu ra chính xác đầy đủ của các loại điểm động trong SQL Server Management Studio

Ví dụ (lưu ý rằng cả những con số này có một đại diện chính xác trong mặc định float),

declare @f1 float 
declare @f2 float 
set @f1 = 1555.49 
set @f2 = 1555.4899999999998 
select @f1, @f2 
select STR(@f1,30,15), STR(@f2,30,15) 

Đầu ra:

1555.49 1555.49 
1555.490000000000000 1555.489999999999800 

Trong Query Analyzer, mà select đầu ra đầu tiên:

1555.49 1555.4899999999998 

Đó là hành vi tôi muốn nhận được từ Management Studio. Có cách nào để ngăn chặn SSMS từ làm tròn trong màn hình hiển thị kết quả của nó?

Trả lời

7

số

SQL Server Management Studio viên đạn giá trị dấu chấm động cho mục đích hiển thị; có một số Connect suggestion to change this behavior nhưng đã bị đóng "theo thiết kế".

Tuy nhiên, SQLCMD, osql và Trình phân tích truy vấn thì không.

SQLCMD -E -S server -Q"SELECT CONVERT(FLOAT, 1555.4899999999998)" 
0

Có lý do nào bạn muốn sử dụng loại phao hơn loại thập phân không? Floats được lưu trữ dưới dạng phân số, khiến chúng thường bị vô hiệu hóa một chút khi thực hiện các thao tác trên chúng. Điều này là ổn khi bạn có một ứng dụng đồ họa trong đó sự thiếu chính xác ít quan trọng hơn kích thước của một pixel, nhưng đó là một vấn đề lớn trong một cái gì đó giống như một ứng dụng kế toán mà bạn đang xử lý tiền.

Tôi muốn nói rằng độ chính xác của số thập phân quan trọng hơn đối với hầu hết các ứng dụng so với bất kỳ lợi ích nào về tốc độ hoặc kích thước mà chúng có được từ việc sử dụng phao.

+1

Giản đồ cơ sở dữ liệu nằm ngoài tầm kiểm soát của tôi, không may. Tôi đồng ý 100% rằng 'float' là một lựa chọn không tốt cho ứng dụng này, nhưng nếu đó là kiểu đúng tôi vẫn mong đợi một biểu diễn chính xác hơn trong Management Studio. – Simon

-2

Chỉnh sửa bài đăng gốc của tôi. Tôi đã cố gắng giải quyết một vấn đề hơi khác khi tôi chạy qua trang này. Tôi chỉ muốn một loại phao để trả về một số "thông thường", chứ không phải ký hiệu khoa học.

Hai đề xuất chuyển đổi ban đầu. Vết thương với điều này sau đó kết thúc. 7 dưới đây có thể được thay đổi để hiển thị như nhiều chữ số thập phân như bạn muốn. Thay thế và cắt tỉa để loại bỏ các số 0 đầu và cuối.

replace (RTRIM (LTRIM (REPLACE (STR (x, 20, 7), '0', ' '))),'', '0')

+2

Mục đích không phải là chuyển đổi sang VARCHAR. Các cuộc gọi STR() trong ví dụ của tôi đã làm điều đó. Tôi đã hy vọng thay đổi hành vi mặc định của SSMS mà không phải thêm chuyển đổi vào truy vấn của mình. Nhân tiện, 5 vị trí sau dấu thập phân cũng không đủ để phân biệt các giá trị trong ví dụ của tôi. Bạn cần ít nhất DECIMAL (28,13) cho điều đó. – Simon

+0

Tôi đã chỉnh sửa câu trả lời của mình. Vẫn không giúp đỡ với SSMS. Chỉ cần trả về biểu diễn chuỗi mà tôi muốn. Có lẽ một cách giải quyết hữu ích. – user600410

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