Cara Membulatkan ke bilangan bulat terdekat di C #


Jawaban:


202

Lihat dokumentasi resmi untuk lebih lanjut. Sebagai contoh:

Pada dasarnya Anda memberikan Math.Roundmetode tiga parameter.

  1. Nilai yang ingin Anda bulatkan.
  2. Jumlah desimal yang ingin Anda simpan setelah nilainya.
  3. Parameter opsional yang dapat Anda panggil untuk menggunakan pembulatan AwayFromZero. ( diabaikan kecuali pembulatannya ambigu, misalnya 1.5 )

Kode sampel:

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

Demo Langsung

Anda perlu MidpointRounding.AwayFromZerojika Anda ingin nilai 0,5 untuk dibulatkan. Sayangnya ini bukan perilaku default untuk Math.Round(). Jika menggunakan MidpointRounding.ToEven(default), nilai dibulatkan ke bilangan genap terdekat ( 1.5dibulatkan ke 2, tetapi 2.5juga dibulatkan ke 2).


14
Di sisi lain, menggunakan away from zerojuga berarti -1.5akan membulatkan ke -2.
davogotland

2
menggunakan Math.Ceiling, itu bukan praktik yang baik untuk menggunakan Math.Round untuk friksi, baca: stackoverflow.com/questions/9221205/… ,
Yakir Manor

3
Saya menemukan bahwa Math.Round (1.5, 0) mengembalikan 2
David Sykes

@davogotland apakah mereka membulatkan 137,5 ke 140 bukan ke 138? Maksud saya pembulatan ke persepuluh terdekat?
sam

1
@sam mungkin bagi dengan 10, lalu bulatkan dengan Math.Ceiling, dan akhirnya dikalikan 10?
davogotland

64
Math.Ceiling

selalu membulat (menuju langit-langit)

Math.Floor

selalu membulatkan ke bawah (menuju ke lantai)

apa yang Anda kejar itu sederhana

Math.Round

yang bulat sesuai posting ini


apakah toh mereka membulatkan 137,5 ke 140 bukan ke 138? Maksud saya pembulatan ke persepuluh terdekat?
sam

7

Anda perlu Math.Round, tidak Math.Ceiling. Ceilingselalu "membulatkan" ke atas, sedangkan Roundmembulatkan ke atas atau ke bawah tergantung pada nilai setelah koma desimal.


6

ada manual ini, dan agak lucu juga:

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);

cukup tambahkan 0,5 ke nomor apa saja, dan lemparkan ke int (atau floor itu) dan itu akan dibulatkan secara matematis dengan benar: D


Itu masih terlihat mencurigakan. Pertama, pertanyaan menanyakan tentang pembulatan ke atas dan kedua, ketika saya mencoba sekarang, implementasi standar dari Math.round (1,5) putaran ke 2. Jadi ini mungkin tidak apa yang ia inginkan.
ver

juga, contoh Anda mencampurkan titik desimal dengan koma desimal. Yang mana yang biasanya Anda gunakan (di Swedia, saya rasa)? :)
ver

Ups ... oh ya, maaf. Tentu saja dalam pemrograman koma desimal, tapi dalam teks formal kita menggunakan koma desimal. dan ya, Swedia ^^ tentang pertanyaan tersebut, dan bagian "pembulatan": saya pikir itu hanya beberapa kesalahan bahasa. dalam contoh yang diberikan oleh op, beberapa bilangan desimal dibulatkan ke bawah.
davogotland

@ Jika saya tidak membulatkan ke bawah dengan Math.Round, saya melakukannya dengan pemeran. itulah mengapa cara ini manual dan agak lucu;)
davogotland

5

Anda dapat menggunakan Math.Round seperti yang disarankan orang lain (disarankan), atau Anda dapat menambahkan 0,5 dan memasukkan int (yang akan menghilangkan bagian desimal).

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

Sekadar pengingat. Waspadalah terhadap penggandaan.

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

3

Anda memiliki fungsi Math.Round yang melakukan apa yang Anda inginkan.

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

1
Bagaimana 1.5dengan nilainya? Anda membutuhkan lebih banyak parameter.
Hanya Bolivia Di Sini

2

ini akan membulatkan ke atas ke 5 terdekat atau tidak berubah jika sudah habis dibagi 5

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

2

Saya mencari ini, tetapi contoh saya adalah mengambil angka, seperti 4,2769 dan menjatuhkannya dalam rentang hanya 4,3. Tidak persis sama, tetapi jika ini membantu:

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

Kemudian:

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

dll ...


Saya menggunakan metode ini karena saya juga membutuhkan string dan .ToString ("n0") menangani pembulatan untuk saya: 1.5m.ToString ("n0") // return "2"
Nathan Prather



0

Jika Anda bekerja dengan bilangan bulat daripada bilangan floating point, inilah caranya.

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

Di sini "numr" dan "denr" adalah bilangan bulat tak bertanda.


0

Menggunakan Math.Round(number)putaran ke bilangan bulat terdekat.


0

Tulis metode putaran Anda sendiri. Sesuatu seperti,

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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.