2013-04-08 45 views
5

Tôi có tập hợp các phép tính sau trong excel mà tôi muốn có thể sử dụng trong quy trình được lưu trữ.Độ chính xác của dấu chấm động SQL được giới hạn trong 6 chữ số

Excel

CellA: 45/448.2 = 0.100401606425703 
CellB: 1-CellA = 0.899598393574297 
CellC: 1-CellB = 0.100401606425703 
CellD: CellC * 448.2 = 45.000000000000000 

Trong SQL Tôi đang làm như sau:

declare @a decimal(18,15) = 45/448.2 
declare @b decimal(18,15) = [email protected] 
declare @c decimal(18,15) = [email protected] 
declare @d decimal(18,15) = @c * 448.2 

Tôi cũng đã cố gắng chạy tính toán trong một dòng

declare @e decimal(18,15) = (1-(1-(45/448.2)))*448.2 

khi tôi trở về các giá trị SQL cung cấp cho tôi những điều sau đây:

@a: 0.100401000000000 
@b: 0.899599000000000 
@c: 0.100401000000000 
@d: 44.999728200000000 

@e: 44.999728200000000 

Tôi đã thử điều chỉnh độ chính xác của số thập phân trong SQL nhưng không có gì tạo nên sự khác biệt, nó chỉ trả về 6 chữ số đầu tiên của số thập phân.

Excel có thực hiện bất kỳ tối ưu hóa nào khi chạy công thức không?

Bất kỳ ý tưởng nào?

+0

Hãy thử, nói, 'CHỌN 45/CAST (448,2 AS DECIMAL (18,1)) '. [Các liên kết ở đây] (http://stackoverflow.com/a/5385417/73226) cho bạn biết các quy tắc cho kiểu dữ liệu kết quả của phép chia. –

+0

@MartinSmith cung cấp cho tôi số thập phân hoàn chỉnh hơn cho @a, mặc dù câu trả lời của tôi là 45.000000000000085 bạn có thể giải thích lý do không? – ScampDoodle

+0

Nó được giải thích trong hai liên kết từ câu trả lời trước đó mà tôi đã quá lười để tái tạo ở trên. 'e1/e2 cho p = p1 - s1 + s2 + tối đa (6, s1 + p2 + 1), s = max (6, s1 + p2 + 1)'. Nếu 'p' sẽ là'> 38' thì 's' bị cắt ngắn tại' 6' –

Trả lời

7

Thậm chí chỉ dòng đầu tiên của bạn là đủ để hiển thị các vấn đề:

declare @a decimal(18,15) = 45/448.2 
print @a 

cho

--------------------------------------- 
0.100401000000000 

Điều này là do các loại dữ liệu. Khi bạn nói

448.2 

nó là (mỗi the documentation) hiểu là một hằng số kiểu decimalalso per the documentation,

Trong báo cáo Transact-SQL, một hằng số với một dấu thập phân là tự động được chuyển đổi thành giá trị dữ liệu số, sử dụng độ chính xác tối thiểu và tỷ lệ cần thiết. Ví dụ, hằng số 12,345 là chuyển đổi thành một giá trị số với một độ chính xác 5 và thang điểm 3.

Vì vậy 448.2decimal(4,3). 45integer, khi được kết hợp với decimalis treated as having precision of 10 and scale 0. Khi chúng tôi chia, the rules nói

Operation  Result precision      Result scale 
e1/e2  p1 - s1 + s2 + max(6, s1 + p2 + 1)  max(6, s1 + p2 + 1) 

mà trong trường hợp này mang lại một độ chính xác kết quả của 10 - 3 + 0 + max(6, 0 + 3 + 1) và quy mô của max(6, 0 + 3 + 1), mà đi ra để 136.

Tỷ lệ kết quả đó là 6 là lý do tại sao kết quả chỉ có sáu chữ số thập phân.

Cách khắc phục nó là đưa toán hạng của bạn vào một loại thích hợp trước khi hành động lên chúng; ví dụ, đây là hai cách sau:

Buộc một số được coi là dấu chấm động:

declare @a decimal(18,15) = 45/448.2e0 
select @a 

--------------------------------------- 
0.100401606425703 

Rõ ràng cung cấp một quy mô thập phân:

declare @a decimal(18,15) = 45/cast(448.2 as decimal(18,10)) 
select @a 

--------------------------------------- 
0.100401606425703 
+0

Điều này đặt tôi trên con đường bên phải, tôi đã phải điều chỉnh bao nhiêu chữ số thập phân, nhưng cuối cùng đây là câu trả lời đúng – ScampDoodle

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