Cách làm tròn đến số nguyên gần nhất trong C #


Câu trả lời:


200

Xem tài liệu chính thức để biết thêm. Ví dụ:

Về cơ bản, bạn cung cấp cho Math.Roundphương thức ba tham số.

  1. Giá trị bạn muốn làm tròn.
  2. Số lượng số thập phân bạn muốn giữ lại sau giá trị.
  3. Một tham số tùy chọn bạn có thể gọi để sử dụng AwayFromZero làm tròn. ( bị bỏ qua trừ khi việc làm tròn không rõ ràng, ví dụ: 1,5 )

Mã mẫu:

var roundedA = Math.Round(1.1, 0); // Output: 1
var roundedB = Math.Round(1.5, 0, MidpointRounding.AwayFromZero); // Output: 2
var roundedC = Math.Round(1.9, 0); // Output: 2
var roundedD = Math.Round(2.5, 0); // Output: 2
var roundedE = Math.Round(2.5, 0, MidpointRounding.AwayFromZero); // Output: 3
var roundedF = Math.Round(3.49, 0, MidpointRounding.AwayFromZero); // Output: 3

Bản thử trực tiếp

Bạn cần MidpointRounding.AwayFromZeronếu bạn muốn giá trị .5 được làm tròn. Thật không may, đây không phải là hành vi mặc định cho Math.Round(). Nếu sử dụng MidpointRounding.ToEven(mặc định), giá trị được làm tròn đến số chẵn gần nhất ( 1.5được làm tròn thành 2, nhưng 2.5cũng được làm tròn thành 2).


14
mặt khác, sử dụng away from zerocũng có nghĩa là -1.5sẽ làm tròn đến -2.
davogotland

2
sử dụng Math.Ceiling, không phải là một thực hành tốt của nó để sử dụng Math.round cho va chạm, đọc: stackoverflow.com/questions/9221205/... ,
Yakir Manor

3
Tôi thấy rằng Math.round (1.5, 0) trả 2
David Sykes

@davogotland là họ vẫn làm tròn 137,5 thành 140 chứ không phải 138? Ý tôi là làm tròn đến phần mười?
sam

1
@sam có lẽ chia cho 10, sau đó làm tròn với Math.Ceiling, và cuối cùng là bội số của 10?
davogotland

63
Math.Ceiling

luôn luôn quay tròn (hướng lên trần nhà)

Math.Floor

luôn luôn tròn xuống (hướng xuống sàn)

những gì bạn đang theo đuổi chỉ đơn giản là

Math.Round

vòng nào theo bài đăng này


Liệu họ có làm tròn 137,5 thành 140 không thành 138? Ý tôi là làm tròn đến phần mười?
sam

7

Bạn cần Math.Round, không phải Math.Ceiling. Ceilingluôn luôn "làm tròn" lên, trong khi làm Roundtròn lên hoặc xuống tùy thuộc vào giá trị sau dấu thập phân.


6

có sách hướng dẫn này, và cũng khá dễ thương:

double d1 = 1.1;
double d2 = 1.5;
double d3 = 1.9;

int i1 = (int)(d1 + 0.5);
int i2 = (int)(d2 + 0.5);
int i3 = (int)(d3 + 0.5);

chỉ cần thêm 0,5 vào bất kỳ số nào và chuyển nó thành int (hoặc tầng của nó) và nó sẽ được làm tròn chính xác về mặt toán học: D


Nó vẫn có vẻ đáng ngờ. Thứ nhất, câu hỏi hỏi về việc làm tròn số và thứ hai, khi tôi vừa thử nó vừa rồi, cài đặt mặc định của Math.Round (1.5) làm tròn thành 2. Vì vậy, đây có thể không phải là điều anh ấy muốn.
ver

ngoài ra, ví dụ của bạn kết hợp dấu thập phân với dấu phẩy thập phân. Bạn thường sử dụng cái nào (ở Thụy Điển, tôi đoán vậy)? :)
ver

oops ... oh yeah, xin lỗi. tất nhiên trong lập trình dấu phẩy thập phân, nhưng trong văn bản chính thức, chúng tôi sử dụng dấu phẩy thập phân. và vâng, người Thụy Điển ^^ về câu hỏi, và phần "làm tròn": tôi nghĩ đó chỉ là một số lỗi ngôn ngữ. trong các ví dụ do op đưa ra, một số số thập phân làm tròn xuống.
davogotland

@ver tôi không làm tròn với Math. Tôi làm điều đó với một cast. đó là lý do tại sao cách này là thủ công và kinda cute;)
davogotland

5

Bạn có thể sử dụng Math.Round như những người khác đã đề xuất (được khuyến nghị) hoặc bạn có thể thêm 0,5 và ép kiểu thành int (sẽ giảm phần thập phân).

double value = 1.1;
int roundedValue = (int)(value + 0.5); // equals 1

double value2 = 1.5;
int roundedValue2 = (int)(value2 + 0.5); // equals 2

5

Chỉ là một lời nhắc nhở. Cẩn thận với gấp đôi.

Math.Round(0.3 / 0.2 ) result in 1, because in double 0.3 / 0.2 = 1.49999999
Math.Round( 1.5 ) = 2

3

Bạn có hàm Math.Round thực hiện chính xác những gì bạn muốn.

Math.Round(1.1) results with 1
Math.Round(1.8) will result with 2.... and so one.

1
Còn 1.5như giá trị thì sao? Bạn cần thêm thông số.
Chỉ Bolivia đây

2

điều này sẽ làm tròn đến 5 gần nhất hoặc không thay đổi nếu nó đã chia hết cho 5

public static double R(double x)
{
    // markup to nearest 5
    return (((int)(x / 5)) * 5) + ((x % 5) > 0 ? 5 : 0);
}

2

Tôi đang tìm kiếm điều này, nhưng ví dụ của tôi là lấy một số, chẳng hạn như 4,2769 và giảm nó trong một khoảng chỉ bằng 4,3. Không hoàn toàn giống nhau, nhưng nếu điều này sẽ giúp:

Model.Statistics.AverageReview   <= it's just a double from the model

Sau đó:

@Model.Statistics.AverageReview.ToString("n1")   <=gives me 4.3
@Model.Statistics.AverageReview.ToString("n2")   <=gives me 4.28

Vân vân...


Tôi đang sử dụng phương pháp này của bạn vì tôi cũng cần một chuỗi và .ToString ("n0") sẽ lo làm tròn cho tôi: 1.5m.ToString ("n0") // trả về "2"
Nathan Prather



0

Nếu bạn đang làm việc với số nguyên thay vì số dấu phẩy động, đây là cách.

#define ROUNDED_FRACTION(numr,denr) ((numr/denr)+(((numr%denr)<(denr/2))?0:1))

Ở đây cả "numr""denr" đều là số nguyên không dấu.


0

Sử dụng Math.Round(number) tròn đến số nguyên gần nhất.


0

Viết phương pháp vòng của riêng bạn. Cái gì đó như,

function round(x) rx = Math.ceil(x) if (rx - x <= .000001) return int(rx) else return int(x) end


-1
decimal RoundTotal = Total - (int)Total;
if ((double)RoundTotal <= .50)
   Total = (int)Total;
else
   Total = (int)Total + 1;
lblTotal.Text = Total.ToString();
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.