Perbedaan antara Math.Floor () dan Math.Truncate ()


422

Apa perbedaan antara Math.Floor()dan Math.Truncate(). NET?


8
misalnya Math.Floor (5.4) = 5 Math.Truncate (5.4) = 5
subramani

3
Anda benar-benar membutuhkan ini setelah 10 tahun aneh? lol
L_Church

1
mengapa setelah 10 tahun ada karunia? sudah banyak jawaban. apakah ada sesuatu yang saya lewatkan di sini?
Puddle

3
Orang ini hanya bertanya 1 pertanyaan dan meninggalkan situs sejak. Kurasa hanya itu yang selalu ingin dia ketahui ..: D
Nikos

Jawaban:


484

Math.Floorputaran ke bawah, Math.Ceilingputaran ke atas, dan Math.Truncateputaran ke arah nol. Jadi, Math.Truncateseperti Math.Flooruntuk angka positif, dan seperti Math.Ceilinguntuk angka negatif. Inilah rujukannya .

Untuk kelengkapan, Math.Roundputaran ke bilangan bulat terdekat. Jika jumlahnya tepat di tengah-tengah antara dua bilangan bulat, maka itu membulat ke arah genap. Referensi.

Lihat juga: jawaban Pax Diablo . Sangat dianjurkan!


31
@ Chris, saya sarankan Anda memperbaiki deskripsi Anda tentang Round, ada dua cara untuk membulatkan (AwayFromZero dan ToEven) dan tidak membulatkan ke bilangan bulat terdekat karena dapat melakukan pembulatan fraksional juga.
paxdiablo

1
Jadi hanya menambahkan pendek ke pertanyaan awal - apa perbedaan antara Math.Truncate dan hanya casting desimal atau dobel ke int? bukankah itu juga hanya membulat ke nol?
Noam Gal

8
Kapan (int)myDoubleberbeda dari (int)Math.Truncate(myDouble)?
buka

2
Apa (int) sama dengan di kelas Matematika?
Lei Yang

386

Ikuti tautan ini untuk deskripsi MSDN tentang:

  • Math.Floor, yang membulatkan ke arah infinity negatif.
  • Math.Ceiling, yang dibulatkan ke arah infinity positif.
  • Math.Truncate, yang membulatkan ke atas atau ke bawah menuju nol.
  • Math.Round, yang membulatkan ke bilangan bulat terdekat atau jumlah tempat desimal yang ditentukan. Anda dapat menentukan perilaku jika persis sama antara dua kemungkinan, seperti pembulatan sehingga angka akhir genap (" Round(2.5,MidpointRounding.ToEven)" menjadi 2) atau sehingga jauh dari nol (" Round(2.5,MidpointRounding.AwayFromZero)" menjadi 3).

Diagram dan tabel berikut dapat membantu:

-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

Perhatikan bahwa Roundjauh lebih kuat daripada yang terlihat, hanya karena dapat membulatkan ke tempat desimal tertentu. Semua yang lain membulatkan ke nol desimal selalu. Sebagai contoh:

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

Dengan fungsi-fungsi lain, Anda harus menggunakan tipuan multiply / bagi untuk mendapatkan efek yang sama:

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

7
Pax, saya pikir Anda memiliki kesalahan dengan: Round (AwayFromZero) -3 -2 1 2 3 Math.Round (-1.2, MidpointRounding.AwayFromZero) == -1 Math.Round (0,3, MidpointRounding.AwayFromZero) == 0,0 dll ..
dtroy

1
Terima kasih, @droy, saya tidak pernah perlu menggunakan mode itu dan, sementara saya mendokumentasikannya dengan benar jika teksnya, saya benar-benar mendapatkan contoh yang salah. Semoga itu diperbaiki sekarang.
paxdiablo

Maaf mengomentari pertanyaan lama seperti itu tetapi saya harus bertanya: Bagaimana Anda bisa memutari "ToEven" menjadi dua tempat desimal? Tentunya aneh dan bahkan hanya berlaku untuk bilangan bulat?
Richiban

4
@Richiban, anggap evensebagai properti digit terakhir dalam angka bulat, bukan berarti seluruh angka harus kelipatan dua. Omong-omong, maaf butuh waktu lama untuk kembali kepada Anda, harap Anda tidak hanya duduk menunggu jawaban saya :-)
paxdiablo

62

Math.Floor() putaran menuju infinity negatif

Math.Truncate membulatkan ke atas atau ke bawah menuju nol.

Sebagai contoh:

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

sementara

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

2
Penjelasan yang bagus dan sederhana dengan contoh singkat, ini harus ditandai sebagai jawaban untuk pertanyaan ini.
nivs1978

44

Beberapa contoh:

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.floorsliiiide ke kiri ...
Math.ceilsliiiide ke kanan ...
Math.truncatecriiiiss crooooss (lantai / langit-langit selalu mengarah ke 0)
Math.roundcha cha, benar-benar mulus ... (pergi ke sisi terdekat)

Ayo berangkat kerja! (⌐ □ _ □)

Ke kiri ... Math.floor
Ambil kembali sekarang, kamu semua ... --
Dua hop kali ini ...-=2

Semua orang bertepuk tangan ✋✋

Seberapa rendah Anda bisa pergi? Bisakah kamu turun rendah? Sepanjang jalan menuju floor?

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

Math.truncate(x)juga sama dengan int(x).
dengan menghapus pecahan positif atau negatif, Anda selalu menuju ke 0.


HAHAHA remix yang bagus.
Daniel berkata Reinstate Monica

26

Mereka secara fungsional setara dengan angka positif. Perbedaannya terletak pada bagaimana mereka menangani angka negatif.

Sebagai contoh:

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

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

Tautan MSDN: - Metode Math.Lantai - Metode Math.Truncate

PS Waspadalah terhadap Matematika. Mungkin tidak seperti yang Anda harapkan.

Untuk mendapatkan hasil pembulatan "standar" gunakan:

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

Coba ini, Contoh:

Math.Floor () vs Math.Truncate ()

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

Juga 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()

Mengembalikan bilangan bulat terbesar kurang dari atau sama dengan angka yang ditentukan. MSDN system.math.floor

math.truncate()

Menghitung bagian integral dari angka. MSDN system.math.truncate



15

Math.Floor(): Mengembalikan bilangan bulat terbesar kurang dari atau sama dengan angka floating-point presisi ganda.

Math.Round(): Membulatkan nilai ke bilangan bulat terdekat atau ke jumlah digit pecahan yang ditentukan.


1
OP bertanya tentang perbedaan antara Floor()dan Truncate(), bukan Floor()dan Round().
Robert Columbia

5

Math.floor()akan selalu dibulatkan mis., mengembalikan integer LEBIH. Sementara round()akan mengembalikan integer TERDEKAT

math.floor ()

Mengembalikan bilangan bulat terbesar kurang dari atau sama dengan angka yang ditentukan.

math.truncate ()

Menghitung bagian integral dari angka.


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.