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

422

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

Pengguna Anonim
sumber
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!

Chris Jester-Young
sumber
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
paxdiablo
sumber
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
Azhar
sumber
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
Marek Grzenkowicz
sumber
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.

Genangan air
sumber
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
Sandesh
sumber
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

safin chacko
sumber
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.

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

vidy
sumber
0

Potong memotong desimal ****

Paul Moore
sumber