Cara Membulatkan ke bilangan bulat terdekat di C #

92

Bagaimana cara membulatkan nilai ke bilangan bulat terdekat?

Sebagai contoh:

1.1 => 1
1.5 => 2
1.9 => 2

"Math.Ceiling ()" tidak membantu saya. Ada ide?

Pengguna SOF
sumber
1
Math.Round () bisa melakukan triknya.
Hanya Bolivia Di Sini

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

Hanya Bolivia Di Sini
sumber
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

devrooms
sumber
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.

dasblinkenlight
sumber
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

davogotland.dll
sumber
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
Marlon
sumber
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
Kosmas
sumber
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.
pengguna496607
sumber
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);
}
rick
sumber
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 ...

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

Penggunaan Math.Round:

double roundedValue = Math.Round(value, 0)
Thomas Levesque
sumber
1
var roundedVal = Math.Round(2.5, 0);

Ini akan memberikan hasil:

var roundedVal = 3
Ankita_systematix
sumber
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.

Sarath Kumar
sumber
0

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

codejockie
sumber
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

Sandeep Anand
sumber
-1
decimal RoundTotal = Total - (int)Total;
if ((double)RoundTotal <= .50)
   Total = (int)Total;
else
   Total = (int)Total + 1;
lblTotal.Text = Total.ToString();
Salma
sumber