2011-12-08 30 views
5

Có điều gì đó im nhìn, nhưng vấn đề này đã làm tôi bực bội rất nhiều. im cố gắng lấy giá trị từ tập dữ liệu và sau đó sử dụng nó để thực hiện một số phép tính. trong tập dữ liệu được xem là đối tượng, vì vậy tôi cần truyền nó thành int hoặc double. Vì lý do nào đó, tôi nhận được một lỗi ngu ngốc khiến tôi lo lắng. heres mã.lỗi # # đúc (giá trị infinte .... cái gì?)

private void SpendsAnalysis() 
    { 
     float tempQty = 0; 
     float tempPrice = 0; 
     double tempTot = 0; 
     double total = 0; 

     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 
      tempQty = (float)row.Cells["Qty"].Value; 
      tempPrice = (float)row.Cells["Unit"].Value; 

      tempTot = tempQty * tempPrice; 
      total += tempTot; 
     } 

     textBox7.Text = total.ToString(); 
    } 

Được ném: "Truyền được chỉ định không hợp lệ". (System.InvalidCastException) khi tạo biểu mẫu một số, phải nhỏ hơn inifnite. Đây là lỗi gây phiền nhiễu. bây giờ tôi lấy dữ liệu từ tập dữ liệu của tôi, dữ liệu lấy dữ liệu từ một thủ tục được lưu trữ. Tôi tin rằng loại trường "Qty" là tiền tệ (yeh, tại sao là qty currency haha, không phải bảng của tôi!). trong chế độ xem dữ liệu của tôi có vẻ như 1.000, đây có phải do chuyển đổi loại không? làm thế nào tôi có thể khắc phục điều này? Rất cám ơn trước!

+4

'float' chắc chắn là một trận đấu tồi tệ hơn 'currency' hoặc' thập phân '. Nhưng bạn âm thanh như nó phải là một số nguyên. Bất kỳ 'float' /' double' nào xảy ra trong một phép tính tiền tệ là một lá cờ đỏ lớn. – CodesInChaos

+0

đồng ý nhưng đây là những giá trị được đặt bởi bảng gốc. im đúc nó vào một giá trị tôi có thể làm việc với, ither đôi hoặc float – lemunk

+0

Và tại sao không 'Decimal'? Bạn có thể sử dụng số thập phân trong C# và chắc chắn đó là lựa chọn tốt hơn so với 'float' hoặc' double' tại đây. – CodesInChaos

Trả lời

9

Một loại dàn diễn viên đã thành công, và không may, đúc trực tiếp từ một object đến một loại khác nhau hơn so với các đối tượng cơ bản sẽ không làm việc, ngay cả khi đúc từ một decimal (loại NET cho currency) vào một float bình thường sẽ hoạt động.

Nếu gõ vào cơ sở dữ liệu là currency, tôi sẽ cố gắng này:

= (float)(decimal)row.Cells["Qty"].Value; 

hay, bạn có thể sử dụng this:

= Convert.ToSingle(row.Cells["Qty"].Value); 

mà sẽ xem xét giá trị thực tế và con số loại chuyển đổi phù hợp để thực hiện.

Để trả lời bình luận của bạn, khái niệm trên bao gồm hai chuyển đổi rõ rệt:

  • Một chuyển đổi unboxing từ object đến một giá trị kiểu, trong trường hợp này cho một người decimal
  • Một chuyển đổi rõ ràng từ decimal để float

Lần đầu tiên, chuyển đổi unboxing, được ghi lại trong phần đặc tả ngôn ngữ C# 4.3.2 (đây là C# 4.0 specification):

Một hoạt động unboxing để một tổ chức phi nullable giá trị kiểu bao gồm đầu tiên kiểm tra xem trường hợp đối tượng là một giá trị đóng hộp của cho không nullable giá trị kiểu, và sau đó sao chép các giá trị trong ví dụ.

(tôi nhấn mạnh)

Tôi cũng có phiên bản chú giải của đặc tả, và Eric Lippert tóm tắt này như:

Mặc dù nó là hợp pháp để chuyển đổi một int không có hộp bọc một unboxed double, không hợp pháp để chuyển đổi một hộp int thành một hộp đôi chưa được đóng hộp — chỉ thành một phần int không được mở hộp.

Các, việc chuyển đổi rõ ràng thứ hai, được diễn tả trong C# ngôn ngữ đặc tả phần 6.2.1:

6.2.1 Explicit Numeric Chuyển đổi
Quá trình chuyển đổi số rõ ràng là chuyển đổi từ một kiểu số sang kiểu số khác mà một chuyển đổi số ẩn (§6.1.2) chưa tồn tại:
...
Từ số thập phân đến sbyte, byt e, ngắn, ushort, int, uint, long, ulong, char, float hoặc tăng gấp đôi.

(một lần nữa, tôi nhấn mạnh)

Để tóm tắt:

  • Khi "đúc" từ một object đến một giá trị kiểu, bạn đang thực sự unboxing giá trị đóng hộp, và trước tiên, bạn phải hủy bỏ giá trị cơ bản thực tế thành loại chính xác của nó, trước khi bạn có thể chuyển đổi nó thành một loại khác.
+0

hmmmmm thú vị – lemunk

+0

ah rất nhiều nhờ convert.tosingle hoạt động một điều trị, do đó, nó thực tế là một đối tượng của nó có nghĩa là nó không thể chuyển đổi? còn có thông tin về điều này không? – lemunk

+3

Có nói rằng tất cả tôi muốn nói trong câu trả lời của tôi, bạn có chắc bạn * muốn * nó như là một 'float' và không phải là một' thập phân'? –

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