Câu trả lời:
Sử dụng Math.round()
, có thể kết hợp vớiMidpointRounding.AwayFromZero
ví dụ:
Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3
double d = 1.234;
int i = Convert.ToInt32(d);
Xử lý làm tròn như vậy:
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.
Math.Round
vì nó trả về một int theo yêu cầu.
[0,.5)
- xuống và chính xác một nửa số - [.5,1)
- lên. Làm tròn đến các số chẵn hơi chẵn, vì nó làm tròn (.5,1.5)
thành 1 nhưng [1.5,2.5]
đến 2.
Bạn cũng có thể sử dụng chức năng:
//Works with negative numbers now
static int MyRound(double d) {
if (d < 0) {
return (int)(d - 0.5);
}
return (int)(d + 0.5);
}
Tùy thuộc vào kiến trúc nó nhanh hơn nhiều lần.
double d;
int rounded = (int)Math.Round(d);
Tôi biết câu hỏi này đã cũ, nhưng tôi đã tìm thấy nó trong câu trả lời cho câu hỏi tương tự của tôi. Tôi nghĩ rằng tôi sẽ chia sẻ lời khuyên rất hữu ích mà tôi đã được đưa ra.
Khi chuyển đổi sang int, chỉ cần thêm .5
vào giá trị của bạn trước khi downcasting. Khi downcasting int
luôn giảm xuống số thấp hơn (ví dụ (int)1.7 == 1
), nếu số của bạn .5
cao hơn hoặc cao hơn, việc thêm .5
sẽ đưa nó lên số tiếp theo và downcast của bạn int
sẽ trả về giá trị chính xác. (ví dụ (int)(1.8 + .5) == 2
)
+ 0.5 * Math.Abs(d)
Các phương thức trong các câu trả lời khác ném OverflowException
nếu giá trị float nằm ngoài phạm vi Int. https://docs.microsoft.com/en-us/dotnet/api/system.convert.toint32?view=netframework-4.8#System_Convert_ToInt32_System_Single_
int result = 0;
try {
result = Convert.ToInt32(value);
}
catch (OverflowException) {
if (value > 0) result = int.MaxValue;
else result = int.Minvalue;
}
Đối với Unity, sử dụng Mathf.RoundToInt .
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
void Start()
{
// Prints 10
Debug.Log(Mathf.RoundToInt(10.0f));
// Prints 10
Debug.Log(Mathf.RoundToInt(10.2f));
// Prints 11
Debug.Log(Mathf.RoundToInt(10.7f));
// Prints 10
Debug.Log(Mathf.RoundToInt(10.5f));
// Prints 12
Debug.Log(Mathf.RoundToInt(11.5f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.0f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.2f));
// Prints -11
Debug.Log(Mathf.RoundToInt(-10.7f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.5f));
// Prints -12
Debug.Log(Mathf.RoundToInt(-11.5f));
}
}
public static int RoundToInt(float f) { return (int)Math.Round(f); }
Tôi đang phát triển một máy tính khoa học có nút Int. Tôi đã tìm thấy sau đây là một giải pháp đơn giản, đáng tin cậy:
double dblInteger;
if( dblNumber < 0 )
dblInteger = Math.Ceiling(dblNumber);
else
dblInteger = Math.Floor(dblNumber);
Math.Round đôi khi tạo ra kết quả không mong muốn hoặc không mong muốn và chuyển đổi rõ ràng thành số nguyên (thông qua cast hoặc Convert.ToInt ...) thường tạo ra các giá trị sai cho các số có độ chính xác cao hơn. Phương pháp trên dường như luôn luôn hoạt động.
Convert.ToInt32()
làm điều tương tự, hay nó chỉ đơn giản là tước bỏ mọi thứ sau số thập phân?