Math.Floor () ve Math.Truncate () arasındaki fark


422

Arasındaki fark nedir Math.Floor()ve Math.Truncate().NET?


8
örneğin Math.Floor (5.4) = 5 Math.Truncate (5.4) = 5
subramani

3
10 yıl sonra gerçekten buna ihtiyacın var mı? lol
L_Church

1
neden 10 yıl sonra bir ödül var? zaten birçok cevap var. burada özlediğim bir şey var mı?
Kanştırma

3
Bu adam sadece 1 soru sordu ve o zamandan beri siteden ayrıldı. Sanırım hep bilmek istediği bu ..: D
Nikos

Yanıtlar:


484

Math.Flooraşağı Math.Ceilingyuvarlar, yukarı Math.Truncateyuvarlar ve sıfıra doğru yuvarlar. Böylece Math.Truncategibidir Math.Floorolumlu sayılar için ve benzeri Math.Ceilingnegatif sayılar için. İşte referans .

Bütünlüğü sağlamak için, Math.Rounden yakın tam sayıya yuvarlar. Sayı tam olarak iki tamsayı arasında ise, o zaman çifte doğru yuvarlar. Referans.

Ayrıca bakınız: Pax Diablo'nun yanıtı . Şiddetle tavsiye edilir!


31
@Chris, Round açıklamanızı düzeltmenizi öneririm, yuvarlamanın iki yolu vardır (AwayFromZero ve ToEven) ve kesirli yuvarlama da yapabileceğinden en yakın tam sayıya yuvarlanmaz.
paxdiablo

1
Yani orijinal soruya sadece kısa bir ekleme - Math.Truncate ile int için bir ondalık veya çift döküm arasındaki fark nedir? sadece sıfıra doğru yuvarlanmayacak mı?
Noam Gal

8
Ne zaman (int)myDoublefarklıdır (int)Math.Truncate(myDouble)?
12'de mpen

2
Nedir (int) ile aynı değeri Math sınıfındaki için?
Lei Yang

386

Aşağıdaki MSDN açıklamaları için şu bağlantıları izleyin:

  • Math.Floornegatif sonsuzluğa doğru yuvarlanır.
  • Math.Ceilingpozitif sonsuzluğa doğru yuvarlar.
  • Math.Truncate, sıfıra doğru yukarı veya aşağı yuvarlar.
  • Math.Round, en yakın tam sayıya veya belirtilen ondalık basamağa yuvarlar. Son basamak eşit olacak şekilde (" Round(2.5,MidpointRounding.ToEven)" 2 oluyor) ya da sıfırdan daha uzakta olacak şekilde (" Round(2.5,MidpointRounding.AwayFromZero)" 3 oluyor) yuvarlama gibi iki olasılık arasında tam olarak eşitse davranışı belirleyebilirsiniz .

Aşağıdaki şema ve tablo yardımcı olabilir:

-3        -2        -1         0         1         2         3
 +--|------+---------+----|----+--|------+----|----+-------|-+
    a                     b       c           d            e

                       a=-2.7  b=-0.5  c=0.3  d=1.5  e=2.8
                       ======  ======  =====  =====  =====
Floor                    -3      -1      0      1      2
Ceiling                  -2       0      1      2      3
Truncate                 -2       0      0      1      2
Round (ToEven)           -3       0      0      2      3
Round (AwayFromZero)     -3      -1      0      2      3

RoundBunun göründüğünden çok daha güçlü olduğunu unutmayın, çünkü belirli bir ondalık basamağa yuvarlanabilir. Diğerleri her zaman sıfır ondalık sayıya yuvarlanır. Örneğin:

n = 3.145;
a = System.Math.Round (n, 2, MidpointRounding.ToEven);       // 3.14
b = System.Math.Round (n, 2, MidpointRounding.AwayFromZero); // 3.15

Diğer işlevlerle, aynı etkiyi elde etmek için çarpma / bölme hilelerini kullanmanız gerekir:

c = System.Math.Truncate (n * 100) / 100;                    // 3.14
d = System.Math.Ceiling (n * 100) / 100;                     // 3.15

7
Pax, sanırım şu konuda bir hatanız var: Yuvarlak (AwayFromZero) -3 -2 1 2 3 Math.Round (-1.2, MidpointRounding.AwayFromZero) == -1 Math.Round (0.3, MidpointRounding.AwayFromZero) == 0.0 vs ..
dtroy

1
Teşekkürler, @dtroy, bu modu kullanmak için hiç bir zaman ihtiyacım olmadı ve eğer metin doğru bir şekilde belgelendiğimde, tamamen örnekleri yanlış aldım. Umarım bu şimdi düzeltildi.
paxdiablo

Böyle eski bir soru hakkında yorum yapmak için üzgünüm ama sormak zorunda: Nasıl "ToEven" iki ondalık basamak için yuvarlayabilirsiniz? Kesinlikle garip ve hatta sadece tamsayılar için mi geçerlidir?
Richiban

4
@Richiban, düşünmek evenson bir özelliği olarak rakam tüm anlam yuvarlak sayısında, değil numarayı ikisinin bir katı olmalıdır. Bu arada, üzgünüm sana geri dönmek çok uzun sürdü, umarım sadece cevabımı beklerken oturmuyorsun :-)
paxdiablo

62

Math.Floor() negatif sonsuza doğru yuvarlar

Math.Truncate sıfıra doğru yukarı veya aşağı yuvarlar.

Örneğin:

Math.Floor(-3.4)     = -4
Math.Truncate(-3.4)  = -3

süre

Math.Floor(3.4)     = 3
Math.Truncate(3.4)  = 3

2
Kısa bir örnekle güzel ve basit bir açıklama, bu sorunun cevabı olarak işaretlenmelidir.
nivs1978

44

Bazı örnekler:

Round(1.5) = 2
Round(2.5) = 2
Round(1.5, MidpointRounding.AwayFromZero) = 2
Round(2.5, MidpointRounding.AwayFromZero) = 3
Round(1.55, 1) = 1.6
Round(1.65, 1) = 1.6
Round(1.55, 1, MidpointRounding.AwayFromZero) = 1.6
Round(1.65, 1, MidpointRounding.AwayFromZero) = 1.7

Truncate(2.10) = 2
Truncate(2.00) = 2
Truncate(1.90) = 1
Truncate(1.80) = 1

29

Math.floorsola
Math.ceildoğru
Math.truncatekayma ... sağa kayma ... criiiiss crooooss (zemin / tavan her zaman 0'a doğru)
Math.roundcha cha, gerçek pürüzsüz ... (en yakın tarafa git)

Hadi işe gidelim! (⌐ □ _ □)

Sola ... Math.floor
Hepinizi şimdi geri alın ... --
Bu sefer iki atlama ...-=2

Herkes ellerini çırpar ✋✋

Ne kadar düşük gidebilirsin? Aşağı inebilir misin? Tüm yol floor?

if (this == "wrong")
    return "i don't wanna be right";

Math.truncate(x)ile aynıdır int(x).
pozitif veya negatif bir fraksiyonu kaldırarak her zaman 0'a doğru ilerlersiniz.


HAHAHA güzel remix.
Daniel, Reinstate Monica'ya

26

İşlevsel olarak pozitif sayılarla eşdeğerdirler. Fark, negatif sayıları nasıl ele aldıklarıdır.

Örneğin:

Math.Floor(2.5) = 2
Math.Truncate(2.5) = 2

Math.Floor(-2.5) = -3
Math.Truncate(-2.5) = -2

MSDN bağlantıları: - Math.Floor Yöntemi - Math.Truncate Yöntemi

PS Matematik dikkat edin. Beklediğiniz gibi olmayabilir.

"Standart" yuvarlama sonucunu elde etmek için şunu kullanın:

float myFloat = 4.5;
Console.WriteLine( Math.Round(myFloat) ); // writes 4
Console.WriteLine( Math.Round(myFloat, 0, MidpointRounding.AwayFromZero) ) //writes 5
Console.WriteLine( myFloat.ToString("F0") ); // writes 5

24

Bunu deneyin, Örnekler:

Math.Floor () ve Math.Truncate () karşılaştırması

Math.Floor(2.56) = 2
Math.Floor(3.22) = 3
Math.Floor(-2.56) = -3
Math.Floor(-3.26) = -4

Math.Truncate(2.56) = 2
Math.Truncate(2.00) = 2
Math.Truncate(1.20) = 1
Math.Truncate(-3.26) = -3
Math.Truncate(-3.96) = -3

Ayrıca Math.Round ()

   Math.Round(1.6) = 2
   Math.Round(-8.56) = -9
   Math.Round(8.16) = 8
   Math.Round(8.50) = 8
   Math.Round(8.51) = 9

math.floor()

Belirtilen sayıdan küçük veya ona eşit olan en büyük tamsayıyı döndürür. MSDN system.math.floor

math.truncate()

Bir sayının integral kısmını hesaplar. MSDN system.math.truncate



15

Math.Floor(): Belirtilen çift kesinlikli kayar nokta sayısından küçük veya ona eşit en büyük tamsayıyı döndürür.

Math.Round(): Bir değeri en yakın tam sayıya veya belirtilen kesirli basamak sayısına yuvarlar.


1
OP arasındaki fark sorulduğunda Floor()ve Truncate()değil Floor()ve Round().
Robert Columbia

5

Math.floor()her zaman aşağı yuvarlanır yani., LESSER tamsayısını döndürür. Süre round()EN YAKIN tamsayı döndürür

math.floor ()

Belirtilen sayıdan küçük veya ona eşit olan en büyük tamsayıyı döndürür.

math.truncate ()

Bir sayının integral kısmını hesaplar.


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.