Làm thế nào tôi có thể chuyển đổi gấp đôi thành giá trị số nguyên gần nhất?


147

Làm thế nào để bạn chuyển đổi một đôi thành int gần nhất?

Câu trả lời:


78

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

6
Sẽ khô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?
Người đàn ông Muffin

208
Không thực sự tạo ra một số nguyên, nhưng gấp đôi.
gatopeich

13
@Ronnie - không, đó là do thiết kế. Theo mặc định, Math.Round sẽ làm tròn số trung điểm (x + .5) thành số chẵn gần nhất . Nếu bạn muốn một hành vi khác, bạn phải chỉ định nó thông qua một cờ. msdn.microsoft.com/en-us/l Library / system.midpointrounding.aspx
nickf

6
Vâng, tôi không bao giờ! :)
Ronnie

5
Đôi không phải là Int.
Evgeni Nabokov

267
double d = 1.234;
int i = Convert.ToInt32(d);

Tài liệu tham khảo

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.


7
Tốt hơn nhiều Math.Roundvì nó trả về một int theo yêu cầu.
Keith

10
@ robert-koritnik. Không chắc chắn tại sao điều đó "không hợp lệ". OP đã không chỉ định quy tắc làm tròn ưa thích và "làm tròn từ 0,5 đến gần nhất" là quy tắc chuẩn từ cách trở lại. Luôn luôn làm tròn có tác dụng thống kê không mong muốn.
Keith

@Keith: Tôi không biết nhưng tôi luôn được dạy làm tròn x.5 lên nhưng tôi có thể thấy lý do để làm điều đó lên hoặc xuống để thống kê. Cảm ơn vì điều đó. PS Rõ ràng khi thấy tôi không thống kê, tài chính hoặc kế toán, nơi loại hình tròn này dường như được mặc định .
Robert Koritnik

3
"Luôn luôn làm tròn có hiệu ứng thống kê không mong muốn" - Điều đó hoàn toàn sai. Làm tròn .5 lên làm tròn chính xác một nửa số - [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.
Jim Balter

11
@JimBalter Vì số 0 không được làm tròn, làm tròn một nửa sẽ giới thiệu một độ lệch dương, do đó nó được gọi là làm tròn không đối xứng. "Làm tròn một nửa đến chẵn" thì không, nếu phân phối của bạn là đủ và làm tròn không sai lệch số chẵn hoặc không đều. Xem nửa cách làm tròn tie-break .
sdds

36

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.


Điều này thật hoàn hảo đối với tôi vì Math.Round không hoạt động theo cách tôi muốn.
Hanna

@cullub đúng vậy. Nó chuyển đổi d đôi có 0,5 được thêm vào nó, thành một số nguyên.
Darrell

Đây là phương pháp ưa thích của tôi - hoạt động theo cách rất đơn giản. Vì vậy, ngắn hơn và dễ đọc hơn Math.Round (d, MidpointRounding.AwayFromZero) và ngắn gọn hơn so với sử dụng câu lệnh if để chọn làm tròn xuống hoặc làm tròn lên. AND, thực sự trả về một số nguyên cuối cùng, không phải là một đôi
binderbound

3
Xem bình luận của @ Eternal21 bên dưới để biết hành vi kỳ lạ về số âm (MyRound (-1.2) = 0)
Chris

2
Đối với bất kỳ ai thắc mắc, vấn đề được đề cập bởi @Chris hiện có lẽ được giải quyết bằng cách kiểm tra xem giá trị có âm hay không.
John Weisz

14
double d;
int rounded = (int)Math.Round(d);

5

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 .5vào giá trị của bạn trước khi downcasting. Khi downcasting intluôn giảm xuống số thấp hơn (ví dụ (int)1.7 == 1), nếu số của bạn .5cao hơn hoặc cao hơn, việc thêm .5sẽ đưa nó lên số tiếp theo và downcast của bạn intsẽ trả về giá trị chính xác. (ví dụ (int)(1.8 + .5) == 2)


13
Vấn đề là nếu bạn cố gắng chuyển đổi các giá trị âm theo cách đó. Ví dụ: -1,25 sẽ kết thúc bằng 0. (-1,25 + 0,5 = 0,75 và một khi được chuyển xuống int it 0). Vì vậy, bạn cần phải trừ 0,5 từ các giá trị âm.
Eternal21

Người ta có thể sử dụng+ 0.5 * Math.Abs(d)
TaW


-1

Đố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));
    }
}

Nguồn

public static int RoundToInt(float f) { return (int)Math.Round(f); }

Q không đề cập hoặc gắn thẻ Unity.
XenoRo

@XenoRo Tôi đã trả lời câu hỏi cũ này cho những người tìm kiếm câu trả lời tương tự khi sử dụng Unity.
zwcloud

2
Bạn có thể trả lời câu hỏi của riêng bạn để chia sẻ kiến ​​thức. Tạo một câu hỏi riêng cho API (trong trường hợp này là Unity) trong các trường hợp như thế này. Câu trả lời nên được áp dụng cho các câu hỏi. Mặt khác, có thể có câu trả lời ở đây cho mỗi API C # duy nhất có chức năng làm tròn.
XenoRo

-2

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.


2
không làm tròn tất cả các số âm và làm tròn tất cả các số dương? Đó không nhất thiết là số nguyên "nhỏ nhất".
Tim Pohlmann

đây không phải là số gần nhất
Samer Aamar

1
Cho 1.99, cái này trả về 1.0.
Jon Schneider
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.