Sự khác biệt giữa Math.Floor () và Math.Truncate ()


422

Sự khác biệt giữa Math.Floor()Math.Truncate()trong .NET là gì?


8
ví dụ Math.Floor (5.4) = 5 Math.Truncate (5.4) = 5
subramani

3
Bạn thực sự cần điều này sau 10 năm lẻ? lol
L_Church 9/2/18

1
Tại sao sau 10 năm lại có tiền thưởng? đã có nhiều câu trả lời rồi. có cái gì tôi đang thiếu ở đây?
Puddle

3
Anh chàng này chỉ hỏi 1 câu hỏi và rời khỏi trang web kể từ đó. Tôi đoán đó là tất cả những gì anh ấy luôn muốn biết ..: D
Nikos

Câu trả lời:


484

Math.Floorlàm tròn xuống, làm Math.Ceilingtròn lên và làm Math.Truncatetròn về không. Vì vậy, Math.Truncategiống như Math.Floorcho số dương, và thích Math.Ceilingcho số âm. Đây là tài liệu tham khảo .

Để đầy đủ, làm Math.Roundtròn đến số nguyên gần nhất. Nếu số chính xác ở giữa hai số nguyên, thì nó sẽ quay tròn về số chẵn. Tài liệu tham khảo.

Xem thêm: Câu trả lời của Pax Diablo . Rất khuyến khích!


31
@Chris, tôi khuyên bạn nên sửa mô tả về Vòng, có hai cách để làm tròn (AwayFromZero và ToEven) và nó không làm tròn đến số nguyên gần nhất vì nó cũng có thể làm tròn số.
paxdiablo

1
Vì vậy, chỉ cần thêm một câu hỏi ngắn vào câu hỏi ban đầu - sự khác biệt giữa Math.Truncate và chỉ truyền một số thập phân hoặc gấp đôi thành int là gì? nó cũng sẽ không tròn về không?
Noam Gal

8
Khi nào (int)myDoublekhác với (int)Math.Truncate(myDouble)?
mpen

2
Là gì (int) tương đương với trong lớp Toán?
Lôi Dương

386

Thực hiện theo các liên kết này cho các mô tả MSDN về:

  • Math.Floor, mà làm tròn xuống về phía vô cực tiêu cực.
  • Math.Ceiling, mà làm tròn lên về phía vô cực tích cực.
  • Math.Truncate, làm tròn lên hoặc xuống về không.
  • Math.Round, làm tròn đến số nguyên gần nhất hoặc số vị trí thập phân được chỉ định. Bạn có thể chỉ định hành vi nếu nó chính xác tương đương giữa hai khả năng, chẳng hạn như làm tròn sao cho chữ số cuối cùng là chẵn (" Round(2.5,MidpointRounding.ToEven)" trở thành 2) hoặc sao cho nó cách xa 0 (" Round(2.5,MidpointRounding.AwayFromZero)" trở thành 3).

Sơ đồ và bảng sau đây có thể giúp:

-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

Lưu ý rằng Roundnó mạnh hơn rất nhiều so với vẻ ngoài của nó, đơn giản vì nó có thể làm tròn đến một số vị trí thập phân cụ thể. Tất cả những người khác làm tròn đến số thập phân không. Ví dụ:

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

Với các chức năng khác, bạn phải sử dụng thủ thuật nhân / chia để đạt được hiệu quả tương tự:

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

7
Pax, tôi nghĩ bạn đã nhầm với: Round (AwayFromZero) -3 -2 1 2 3 Math.Round (-1.2, MidpointRounding.AwayFromZero) == -1 Math.Round (0.3, MidpointRounding.AwayFromZero) == 0,0 vv ..
dtroy

1
Cảm ơn, @dtroy, tôi chưa bao giờ có nhu cầu sử dụng chế độ đó và, trong khi tôi ghi lại nó một cách chính xác nếu văn bản, tôi hoàn toàn hiểu sai các ví dụ. Hy vọng rằng điều đó đã được sửa bây giờ.
paxdiablo

Xin lỗi để nhận xét về một câu hỏi cũ như vậy nhưng tôi phải hỏi: Làm thế nào bạn có thể làm tròn "ToEven" thành hai chữ số thập phân? Chắc chắn lẻ và thậm chí chỉ áp dụng cho số nguyên?
Richiban

4
@Richiban, nghĩ về evennhư một tính chất của chữ số cuối cùng trong số được làm tròn, không có nghĩa là toàn bộ số phải là bội của hai. Nhân tiện, xin lỗi, phải mất rất lâu để quay lại với bạn, hy vọng bạn không chỉ ngồi chờ đợi phản hồi của tôi :-)
paxdiablo

62

Math.Floor() vòng về phía vô cực tiêu cực

Math.Truncate làm tròn lên hoặc xuống về phía không.

Ví dụ:

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

trong khi

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

2
Giải thích hay và đơn giản với một ví dụ ngắn, điều này nên được đánh dấu là câu trả lời cho câu hỏi này.
nivs1978

44

Vài ví dụ:

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 bên trái ...
Math.ceilsliiiide bên phải ...
Math.truncatecriiiiss crooooss (sàn / trần luôn hướng về 0)
Math.round cha cha, thực sự trơn tru ... (đi về phía gần nhất)

Chúng ta đi làm đi! (⌐ □ _ □)

Ở bên trái ... Math.floor
Đưa nó trở lại ngay bây giờ ... --
Hai bước nhảy lần này ...-=2

Mọi người vỗ tay

Làm thế nào thấp bạn có thể đi? Bạn có thể xuống thấp? Tất cả các cách để floor?

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

Math.truncate(x)cũng giống như int(x).
bằng cách loại bỏ phần dương hoặc phần âm, bạn luôn hướng về 0.


HAHAHA phối lại tốt đẹp.
Daniel nói Phục hồi lại

26

Chúng có chức năng tương đương với số dương. Sự khác biệt là cách họ xử lý số âm.

Ví dụ:

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

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

Liên kết MSDN: - Phương pháp Math.Floor - Phương pháp Math.Truncate

PS Cẩn thận với Math.Round nó có thể không phải là những gì bạn mong đợi.

Để có được kết quả làm tròn "chuẩn", hãy sử dụng:

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

Hãy thử điều này, Ví dụ:

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

Ngoài ra 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()

Trả về số nguyên lớn nhất nhỏ hơn hoặc bằng số đã chỉ định. MSDN system.math.floor

math.truncate()

Tính phần tích phân của một số. MSDN system.math.truncate



15

Math.Floor(): Trả về số nguyên lớn nhất nhỏ hơn hoặc bằng số dấu phẩy động có độ chính xác kép được chỉ định.

Math.Round(): Làm tròn một giá trị cho số nguyên gần nhất hoặc với số chữ số phân số đã chỉ định.


1
OP đã hỏi về sự khác biệt giữa Floor()Truncate(), không Floor()Round().
Robert Columbia

5

Math.floor()sẽ luôn làm tròn xuống tức là., nó trả về số nguyên LESSER. While round()sẽ trả về số nguyên NEAREST

math.floor ()

Trả về số nguyên lớn nhất nhỏ hơn hoặc bằng số đã chỉ định.

math.truncate ()

Tính phần tích phân của một số.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.