C # 'da en yakın tam sayıya nasıl yuvarlanır


Yanıtlar:


203

Daha fazla bilgi için resmi belgelere bakın . Örneğin:

Temel olarak Math.Roundyönteme üç parametre verirsiniz .

  1. Yuvarlamak istediğiniz değer.
  2. Değerden sonra tutmak istediğiniz ondalık sayıların sayısı.
  3. AwayFromZero yuvarlamasını kullanmak için çağırabileceğiniz isteğe bağlı bir parametre. ( yuvarlama belirsiz olmadığı sürece yoksayılır, ör. 1.5 )

Basit kod:

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

Canlı Demo

MidpointRounding.AwayFromZero.5 değerinin yuvarlanmasını istiyorsanız ihtiyacınız var . Maalesef bu varsayılan davranış değil Math.Round(). Kullanılıyorsa MidpointRounding.ToEven(varsayılan) değer en yakın çift sayıya 1.5yuvarlanır ( yuvarlanır 2, ancak 2.5aynı zamanda yuvarlanır 2).


14
Öte yandan kullanmak , yuvarlanacağı away from zeroanlamına da gelir . -1.5-2
davogotland

2
Math.Round'u kullanın, anlaşmazlıklar için Math.Round'u kullanmak iyi bir uygulama değil, okuyun: stackoverflow.com/questions/9221205/… ,
Yakir Manor

3
Math.Round (1.5, 0) 'ın 2 değerini döndürdüğünü buluyorum
David Sykes

@davogotland, 137.5'i 140'a değil 138'e yuvarlayacak mı? Yani en yakın onda birine yuvarlamak mı?
sam

2
@sam belki 10'a bölün, sonra Math.Ceiling ile yuvarlayın ve sonunda 10'a çarpın?
davogotland

64
Math.Ceiling

her zaman yukarı yuvarlar (tavana doğru)

Math.Floor

her zaman aşağı yuvarlar (zemine doğru)

peşinde olduğun şey basitçe

Math.Round

göre olan mermi Bu yazı


137.5'i 140'a değil 138'e yuvarlayacaklar mı? Yani en yakın onda birine yuvarlamak mı?
sam

7

İhtiyacın Math.Roundyok Math.Ceiling. ondalık noktadan sonraki değere bağlı olarak yukarı veya aşağı yuvarlarken Ceilingher zaman yukarı "yuvarlar" Round.


6

bu kılavuz var ve çok da sevimli bir yol var:

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

herhangi bir sayıya 0.5 ekleyin ve bunu int'e çevirin (veya katlayın) ve matematiksel olarak doğru şekilde yuvarlanır: D


Hala şüpheli görünüyor. Öncelikle, soru yuvarlama sorar kadar bu ne istediğini olmayabilir Yani 2'ye, sadece şimdi Math.Round (1.5) mermi varsayılan uygulaması denedim zaman, ikincisi ve.
ver

ayrıca, örneğiniz ondalık noktayı ondalık virgülle karıştırır. Normalde hangisini kullanıyorsunuz (İsveç'te sanırım)? :)
ver

oops ... oh evet, üzgünüm. elbette ondalık noktayı programlarken, ancak resmi metinde ondalık virgül kullanıyoruz. ve evet, isveç ^^ soru ve "yuvarlama" kısmı hakkında: bence bu sadece bir dil hatası. op ile verilen örneklerde bazı ondalık sayılar aşağı yuvarlanır.
davogotland

@ver Math.Round ile yuvarlamıyorum, bunu bir alçı ile yapıyorum. bu yüzden bu yol manuel ve çok sevimli;)
davogotland

5

Math.Round'u diğerlerinin önerdiği gibi (önerilen) kullanabilir veya 0.5 ekleyip int'e çevirebilirsiniz (bu, ondalık kısmı atacaktır).

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

Sadece bir hatırlatıcı. İki katına dikkat edin.

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

3

Tam olarak istediğinizi yapan Math.Round fonksiyonuna sahipsiniz.

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

2
1.5Değer olarak ne olacak ? Daha fazla parametreye ihtiyacınız var.
Sadece Bolivyalı Burada

2

bu, en yakın 5'e yuvarlanır veya zaten 5'e bölünebiliyorsa değişmez

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

2

Bunu arıyordum, ancak örneğim 4,2769 gibi bir sayı alıp sadece 4,3 olarak bir aralıkta düşürmekti. Tam olarak aynı değil, ancak bu yardımcı olursa:

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

Sonra:

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

vb...


Bunu yönteminizi kullanıyorum çünkü ayrıca bir dizgeye ihtiyacım var ve .ToString ("n0") benim için yuvarlama işini hallediyor: 1.5m.ToString ("n0") // "2" döndürür
Nathan Prather



0

Kayan nokta sayıları yerine tamsayılarla çalışıyorsanız, işte yol.

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

İşte hem "numr" ve "DENR" işaretsiz tam sayılardır.



0

Kendi yuvarlak yönteminizi yazın. Gibi bir şey,

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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.