2009-02-01 76 views
183

Làm cách nào để chuyển đổi số thập phân sang int?Làm thế nào để chuyển đổi một số thập phân thành một int trong C#?

+9

Sẽ rất hữu ích khi biết bạn muốn quay vòng vào int gần nhất hay chỉ thả các số sau dấu thập phân (tức là: luôn tròn xuống) – Dinah

+112

tôi thành thật không thấy điểm trong các câu hỏi chính xác. có, câu trả lời có thể được tìm thấy trên google BUT nó sẽ không chỉ cải thiện chất lượng của trang web nếu mọi người ngừng đóng mỗi câu hỏi thứ hai? nó không giống như câu hỏi này là spam hoặc bất cứ điều gì, và tôi chắc chắn nó sẽ hữu ích cho nhiều người mới đến C# –

Trả lời

228

Sử dụng Convert.ToInt32 từ mscorlib như trong

decimal value = 3.14m; 
int n = Convert.ToInt32(value); 

Xem MSDN. Bạn cũng có thể sử dụng Decimal.ToInt32. Một lần nữa, hãy xem MSDN. Cuối cùng, bạn có thể thực hiện một dàn diễn viên trực tiếp như trong

decimal value = 3.14m; 
int n = (int) value; 

sử dụng toán tử đúc rõ ràng. Xem MSDN.

+8

Xem ra: Chuyển đổi có một số hành vi đáng ngạc nhiên đối với một số chuyển đổi nhất định ('null' so với' 0' so với '" "'). Tôi khuyên bạn không bao giờ sử dụng Chuyển đổi trừ khi bạn hoàn toàn cần sự linh hoạt của nó (ví dụ: trong các trường hợp được nhập động) –

+1

-1 vì điều này sẽ không hoạt động đối với các giá trị như decimal.MaxValue và decimal.MinValue và kết quả trong 'OverflowException'. Tôi tin rằng @Will cung cấp một câu trả lời tốt hơn ở đây http://stackoverflow.com/a/501165/39532 – mezoid

+2

Hãy cẩn thận, vì 'Convert.ToInt32' và' Decimal.ToInt32' hoạt động khác nhau. Từ MSDN: 'Decimal.ToInt32' - Giá trị trả về là phần không thể tách rời của giá trị thập phân; các số thập phân được ** cắt ngắn **. 'Convert.ToInt32' - Giá trị trả về ** được làm tròn ** thành số nguyên có dấu 32 bit gần nhất. Nếu giá trị nằm giữa hai số nguyên, số chẵn được trả về; nghĩa là, 4.5 được chuyển thành 4 và 5.5 được chuyển thành 6. – vezucci

8

System.Decimal triển khai giao diện IConvertable, có thành viên ToInt32().

Gọi điện thoại System.Decimal.ToInt32() có phù hợp với bạn không?

+1

Từ [tài liệu] (https://msdn.microsoft.com/en-us/library/bb350799 (v = vs.110) .aspx) : "API này hỗ trợ cơ sở hạ tầng .NET Framework và không có ý định sử dụng trực tiếp từ mã của bạn". Tại sao không sử dụng Convert.ToInt32? –

18
decimal d = 2; 
int i = (int) d; 

Điều này sẽ chỉ hoạt động tốt.

+0

Cẩn thận, với thông tin chuyển đổi rõ ràng có thể bị mất. – Phaedrus

+18

Khi chuyển đổi từ thập phân sang int, thông tin sẽ hầu như luôn luôn bị mất nhưng tôi tin rằng đó là kinda điểm. – Dinah

38
int i = (int)d; 

sẽ cho bạn số được làm tròn xuống.

Nếu bạn muốn làm tròn đến số chẵn gần nhất (nghĩa> .5 sẽ làm tròn lên), bạn có thể sử dụng

int i = (int)Math.Round(d, MidpointRounding.ToEven); 

Nói chung bạn có thể cast giữa tất cả các loại số trong C#. Nếu không có thông tin rằng sẽ bị mất trong các diễn viên bạn có thể làm điều đó mặc nhiên:

int i = 10; 
decimal d = i; 

mặc dù bạn vẫn có thể làm điều đó một cách rõ ràng nếu bạn muốn:

int i = 10; 
decimal d = (decimal)i; 

Tuy nhiên, nếu bạn đang đi để mất thông tin thông qua dàn diễn viên, bạn phải làm rõ ràng (để cho bạn biết rằng bạn có thể mất thông tin):

decimal d = 10.5M; 
int i = (int)d; 

Ở đây bạn đang mất ".5". Điều này có thể là tốt, nhưng bạn phải rõ ràng về nó và làm cho một diễn viên rõ ràng để cho bạn biết bạn có thể bị mất thông tin.

8

Thủ thuật gọn gàng để làm tròn nhanh là thêm 0,5 trước khi bạn nhập số thập phân của bạn vào một int.

decimal d = 10.1m; 
d += .5m; 
int i = (int)d; 

Tuy nhiên lá i=10, nhưng

decimal d = 10.5m; 
d += .5m; 
int i = (int)d; 

Sẽ tròn để i=11.

+5

Tại sao phải làm điều này khi có Math.Floor và Math.Ceiling? – Badaro

+0

Vào thời điểm đó, tôi đã khá mới đối với C# và vì một lý do nào đó tôi không nhận ra những chức năng này tồn tại. Nó thực sự là một mẹo tôi đã học được từ C/C++, nơi nó rõ ràng là hữu ích hơn. – DeadlyBrad42

+1

Nếu giá trị thập phân là gì, ví dụ: -9.3? – supercat

64

Bạn không thể.

Vâng, tất nhiên bạn có thể, tuy nhiên một int (System.Int32) không đủ lớn để giữ mọi giá trị thập phân có thể.

Điều đó có nghĩa là nếu bạn nhập một số thập phân lớn hơn int.MaxValue bạn sẽ tràn và nếu số thập phân nhỏ hơn int.MinValue, nó sẽ bị tràn.

Điều gì sẽ xảy ra khi bạn dưới/tràn? Một trong hai điều. Nếu xây dựng của bạn được bỏ chọn (tức là, CLR không quan tâm nếu bạn làm), ứng dụng của bạn sẽ tiếp tục sau khi giá trị trên/underflows, nhưng giá trị trong int sẽ không được những gì bạn mong đợi. Điều này có thể dẫn đến lỗi liên tục và có thể khó khắc phục. Bạn sẽ kết thúc ứng dụng của mình ở trạng thái không xác định có thể dẫn đến việc ứng dụng của bạn làm hỏng bất kỳ dữ liệu quan trọng nào mà nó đang hoạt động. Không tốt.

Nếu lắp ráp của bạn được kiểm tra (thuộc tính-> build-> advanced-> kiểm tra tràn/tràn số học hoặc tùy chọn trình biên dịch/kiểm tra), mã của bạn sẽ ném một ngoại lệ khi xảy ra tình trạng tràn/tràn. Điều này có lẽ tốt hơn là không; tuy nhiên mặc định cho các assembly không phải là để kiểm tra over/underflow.

Câu hỏi thực sự là "bạn đang cố gắng làm gì?" Nếu không biết yêu cầu của bạn, không ai có thể cho bạn biết những gì bạn nên làm trong trường hợp này, khác với điều hiển nhiên: KHÔNG LÀM VIỆC.

Nếu bạn đặc biệt KHÔNG quan tâm, câu trả lời ở đây là hợp lệ. Tuy nhiên, bạn nên giao hiểu biết của bạn rằng một tràn có thể xảy ra và rằng nó không quan trọng bằng cách gói đang cast của bạn trong một khối kiểm soát

unchecked 
{ 
    // do your conversions that may underflow/overflow here 
} 

Bằng cách đó người đến phía sau bạn hiểu bạn không và nếu trong tương lai, ai đó thay đổi các bản dựng của bạn thành/được kiểm tra, mã của bạn sẽ không đột ngột phá vỡ.

Nếu tất cả những gì bạn muốn làm là giảm phần phân số của số, rời khỏi phần tách rời, bạn có thể sử dụng Math.Truncate.

decimal actual = 10.5M; 
decimal expected = 10M; 
Assert.AreEqual(expected, Math.Truncate(actual)); 
+3

Mặc dù tôi nghi ngờ chúng là cùng một điều dưới mui xe nếu đầu vào là một số thập phân, tôi cảm thấy thoải mái hơn bằng cách sử dụng Decimal.Truncate hơn Math.Truncate, vì sau này cũng chấp nhận đôi và do đó có thể được hiểu để có thể cắt ngắn ngay cả các số không phải là cơ sở 10, trái ngược với Decimal.Truncate, là một sự cắt ngắn thực sự của một số cơ sở 10. – Brian

+6

Các ngữ cảnh không được chọn không áp dụng cho số thập phân; hoạt động trên số thập phân sẽ ném OverflowExceptions bất kể. – Dave

+0

@dave Damnit, bạn nói đúng. BRB, ECMA. – Will

6

Tôi thích sử dụng Math.Round, Math.Floor, Math.Ceiling hoặc Math.Truncate để thiết lập một cách rõ ràng chế độ làm tròn cho phù hợp.

Lưu ý rằng tất cả đều trả về thập phân - kể từ thập phân có phạm vi giá trị lớn hơn Int32, vì vậy bạn vẫn sẽ cần truyền (và kiểm tra tràn/tràn).

checked { 
    int i = (int)Math.Floor(d); 
} 
0

Tôi thấy rằng toán tử đúc không hoạt động nếu bạn có số thập phân đóng hộp (tức là giá trị thập phân bên trong một loại đối tượng). Convert.ToInt32 (thập phân như đối tượng) hoạt động tốt trong trường hợp này.

Tình trạng này đi lên khi lấy giá trị SẮC/AutoNumber từ cơ sở dữ liệu:

SqlCommand foo = new SqlCommand("INSERT INTO...; SELECT SCOPE_IDENTITY()", conn); 
int ID = Convert.ToInt32(foo.ExecuteScalar()); // works 
int ID = (int)foo.ExecuteScalar();    // throws InvalidCastException 

Xem 4.3.2 Unboxing conversions

+2

Bổ sung thêm vào nó để tham khảo: đó là bởi vì bạn chỉ có thể unbox đến cùng một loại ban đầu. Ở đây 'SELECT SCOPE_IDENTITY()' trả về 'số (38, 0)' dịch thành 'thập phân' bởi .NET. 'foo.ExecuteScalar()' trả về một 'thập phân' được đóng thành' đối tượng' không thể được đưa trực tiếp vào 'int'. '(int) (thập phân) foo.ExecuteScalar()' hoặc 'Convert.ToInt32 (foo.ExecuteScalar())' sẽ hoạt động. – rageit

5

thập phân d = 5.5;

int i = decimal.ToInt32(d);// you will get i = 5 

ref: link text

3

Làm tròn một số thập phân cho số nguyên gần nhất

decimal a ; 
int b = (int)(a + 0.5m); 

khi a = 49.9, sau đó b = 50

khi a = 49.5, sau đó b = 50

khi a = 49.4, sau đó b = 49, vv

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