2013-02-19 16 views
5

Tôi đang cố gắng hiểu tại sao Entity Framework 4 làm tròn đến hai số thập phân khi trong cả mô hình lược đồ EF và trong cơ sở dữ liệu, độ chính xác được đặt thành 4.Entity Framework làm tròn bốn số thập phân

Đây là định nghĩa giản đồ của tôi cho một trong những lĩnh vực thập phân:

SellPrice specify a scale of 19,4

Đây là định nghĩa cơ sở dữ liệu của tôi

CREATE TABLE OrderItems(
.... 
[SellPrice] [decimal](19, 4) NOT NULL, 
.... 

Khi tôi thực hiện truy vấn chèn của tôi sau khi tính toán giá bán của sản phẩm, tôi thấy rằng có đủ số thập phân

SellPrice shows lots of decimals

Các MiniProfiler hiển thị truy vấn của tôi và nó sẽ hiển thị rằng giá trị có số thập phân của nó

DECLARE ... 
     @15 Decimal = '100,54347826086956521739130435', 
     ... 

insert [dbo].[OrderItems](..., [SellPrice], ...) 
values (..., @15, ....) 
select [OrderItemId] 
from [dbo].[OrderItems] 
where @@ROWCOUNT > 0 and [OrderItemId] = scope_identity() 

Nhưng khi tôi xem xét thông qua Microsoft SQL Profiler, các SellPrice được làm tròn

exec sp_executesql N'insert [dbo].[OrderItems](..., [SellPrice], ...) 
values (..., @15, ...)', 
...,@15=100.54,...' 

Tôi gặp khó khăn khi tìm giá trị đang được làm tròn.

+0

Bài đăng này có hữu ích không? http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/c423a005-6a42-4f8d-aab6-e13fe3bdffba – mbeckish

Trả lời

3

tại một đoán, tôi muốn nói rằng datatype SQL của bạn nên được money, không decimal như decimal trong C# là không giống như decimal SQL. Đặc biệt, nếu bạn xem tài liệu MSDN (http://msdn.microsoft.com/en-us/library/ms187746.aspx) cho loại TSQL decimal là trạng thái;

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

Chuyển đổi từ thập phân hoặc số sang float hoặc thực có thể gây mất chính xác.

Nó không được tuyên bố rõ ràng rằng đây là nguyên nhân gây ra sự cố của bạn nhưng tôi đoán là đúng. Bạn có thể có nhiều may mắn hơn với kiểu dữ liệu money vì đó là điều bình đẳng nhất và đó cũng là những gì EF mặc định nếu bạn tạo mô hình từ một DB hiện tại

+2

Tôi đã cố gắng đặt trường thành tiền thay thế. Nó không hoạt động. Tôi cũng đã cố gắng để làm một mô hình thực thể chỉ để xem cách họ sẽ bản đồ và nó hiển thị một chính xác 19 và một quy mô của 4, nhưng Sql Profiler vẫn cho thấy thập phân (19,2). Nó phải ở đâu đó khác, nhưng tôi không thể tìm thấy ở đâu. –

+1

@ Pierre-AlainVigeant, bạn có rõ ràng đặt Quy mô và Độ chính xác hoặc các cài đặt này tự động cho bạn khi bạn cố cập nhật sơ đồ EF/DB không? Trên một lưu ý khác, bạn có tạo cơ sở dữ liệu trước hoặc mô hình không? – DiskJunky