Làm thế nào để tôi chuyển đổi một số thập phân thành một int?
Làm thế nào để tôi chuyển đổi một số thập phân thành một int?
Câu trả lời:
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, xem MSDN . Cuối cùng, bạn có thể thực hiện một vai trực tiếp như trong
decimal value = 3.14m;
int n = (int) value;
trong đó sử dụng toán tử cast rõ ràng. Xem MSDN .
null
so 0
với so với ""
). Tôi khuyên bạn không bao giờ nên sử dụng Convert trừ khi bạn thực sự cần sự linh hoạt của nó (tức là trong các tình huống được gõ động)
OverflowException
. Tôi tin rằng @Will cung cấp câu trả lời tốt hơn tại đây stackoverflow.com/a/501165/39532
Convert.ToInt32
và Decimal.ToInt32
cư xử khác nhau. Từ MSDN: Decimal.ToInt32
- Giá trị trả về là phần không thể thiếu của giá trị thập phân; chữ số phân số được cắt ngắn . Convert.ToInt32
- Trả về giá trị được làm tròn đến số nguyên có chữ ký 32 bit gần nhất. Nếu giá trị là một nửa giữa hai số nguyên, số chẵn được trả về; nghĩa là, 4,5 được chuyển đổi thành 4 và 5,5 được chuyển đổi thành 6.
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 để chứa mọi giá trị thập phân có thể.
Điều đó có nghĩa là nếu bạn truyền 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ì xảy ra khi bạn dưới / tràn? Một trong hai điều. Nếu bản dựng của bạn không được chọn (nghĩa là CLR không quan tâm nếu bạn làm như vậy), ứng dụng của bạn sẽ tiếp tục sau khi giá trị trên / dưới, nhưng giá trị trong int sẽ không như bạn mong đợi. Điều này có thể dẫn đến các lỗi không 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 trong trạng thái không xác định có thể dẫn đến ứng dụng của bạn làm hỏng bất kỳ dữ liệu quan trọng nào mà nó hoạt động. Không tốt.
Nếu hội đồng của bạn được chọn (thuộc tính-> build-> advanced-> kiểm tra 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ẽ đưa ra một ngoại lệ khi xảy ra lỗi tràn / tràn. Điều này có lẽ tốt hơn không; tuy nhiên, mặc định cho các hội đồng không phải là để kiểm tra quá / tràn.
Câu hỏi thực sự là "bạn đang cố gắng làm gì?" Không biết yêu cầu của bạn, không ai có thể nói cho bạn biết bạn nên làm gì trong trường hợp này, ngoài điều hiển nhiên: ĐỪNG LÀM NÓ.
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 truyền đạt sự hiểu biết của mình rằng có thể xảy ra tràn và không thành vấn đề bằng cách gói mã cast của bạn trong một khối không được kiểm tra
unchecked
{
// do your conversions that may underflow/overflow here
}
Bằng cách đó, những người đến sau bạn hiểu rằng bạn không quan tâm và nếu trong tương lai ai đó thay đổi bản dựng của bạn thành / kiểm tra, mã của bạn sẽ không bị hỏng bất ngờ.
Nếu tất cả những gì bạn muốn làm là bỏ phần phân số của số, để lạ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));
int i = (int)d;
sẽ cung cấp cho bạn số 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 là> .5 sẽ làm tròn số), bạn có thể sử dụng
int i = (int)Math.Round(d, MidpointRounding.ToEven);
Nói chung, bạn có thể chuyển giữa tất cả các loại số trong C #. Nếu không có thông tin nào bị mất trong quá trình phân vai, bạn có thể thực hiện nó một cách ngầm định:
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 sắp mất thông tin qua các diễn viên, bạn phải làm điều đó một cách rõ ràng (để cho bạn biết rằng bạn có thể đang 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ể tốt, nhưng bạn phải rõ ràng về nó và thực hiện một diễn viên rõ ràng để cho bạn biết bạn có thể bị mất thông tin.
ToEven
nên ngăn chặn sự trôi dạt thống kê. Tuy nhiên, nếu bạn hoạt động với các mặt hàng có tính phí hoặc tiền, AwayFromZero
có vẻ như là lựa chọn đúng đắn.
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);
Đây là một trang web chuyển đổi loại dữ liệu rất tiện dụng cho những người khác. http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html
System.Decimal
thực hiện IConvertable
giao diện, trong đó có một ToInt32()
thành viên.
Gọi điện có System.Decimal.ToInt32()
làm việc cho bạn không?
Một mẹo gọn gàng để làm tròn nhanh là thêm 0,5 trước khi bạn chuyển số thập phân của mình sang số nguyên.
decimal d = 10.1m;
d += .5m;
int i = (int)d;
Lá vẫn i=10
, nhưng
decimal d = 10.5m;
d += .5m;
int i = (int)d;
Sẽ làm tròn lên mà i=11
.
Tôi thích sử dụng Math.Round , Math.Floor , Math.Cading hoặc Math.Truncate để đặt rõ ràng chế độ làm tròn là phù hợp.
Lưu ý rằng tất cả chúng cũng trả về Decimal - vì Decimal có phạm vi giá trị lớn hơn Int32, do đó bạn sẽ vẫn cần truyền (và kiểm tra mức tràn / tràn).
checked {
int i = (int)Math.Floor(d);
}
Tôi thấy rằng toán tử truyền không hoạt động nếu bạn có một số thập phân được đóng hộp (tức là một giá trị thập phân bên trong một loại đối tượng). Convert.ToInt32 (thập phân là đối tượng) hoạt động tốt trong trường hợp này.
Tình huống này xuất hiện khi truy xuất các giá trị IDENTITY / 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
SELECT SCOPE_IDENTITY()
trả về numeric(38, 0)
mà dịch sang decimal
.NET. foo.ExecuteScalar()
trả về một decimal
hộp object
mà không thể được đúc trực tiếp đến một int
. (int)(decimal)foo.ExecuteScalar()
hoặc Convert.ToInt32(foo.ExecuteScalar())
sẽ làm việc.
Không có câu trả lời nào có vẻ như đối phó với OverflowException / UnderflowException xuất phát từ việc cố gắng chuyển đổi một số thập phân nằm ngoài phạm vi của int.
int intValue = (int)Math.Max(int.MinValue, Math.Min(int.MaxValue, decimalValue));
Giải pháp này sẽ trả về giá trị int tối đa hoặc tối thiểu có thể nếu giá trị thập phân nằm ngoài phạm vi int. Bạn có thể muốn thêm một số làm tròn với Math.Round, Math.Cading hoặc Math.Floor khi giá trị nằm trong phạm vi int.