วิธีปัดเศษเป็นจำนวนเต็มที่ใกล้ที่สุดใน C #


94

ฉันจะปัดเศษค่าเป็นจำนวนเต็มที่ใกล้ที่สุดได้อย่างไร

ตัวอย่างเช่น:

1.1 => 1
1.5 => 2
1.9 => 2

"Math.Ceiling ()" ไม่ได้ช่วยฉัน ความคิดใด ๆ ?


1
Math.Round () สามารถทำเคล็ดลับ
เฉพาะโบลิเวียที่นี่

คำตอบ:


204

ดูเอกสารอย่างเป็นทางการสำหรับข้อมูลเพิ่มเติม ตัวอย่างเช่น:

โดยทั่วไปคุณให้Math.Roundพารามิเตอร์สามวิธี

  1. ค่าที่คุณต้องการปัดเศษ
  2. จำนวนทศนิยมที่คุณต้องการเก็บไว้หลังค่า
  3. พารามิเตอร์ทางเลือกที่คุณสามารถเรียกใช้เพื่อใช้การปัดเศษ AwayFromZero ( ละเว้นเว้นแต่การปัดเศษจะคลุมเครือเช่น 1.5 )

โค้ดตัวอย่าง:

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

การสาธิตสด

คุณต้องMidpointRounding.AwayFromZeroถ้าคุณต้องการให้ค่า. 5 ถูกปัดเศษขึ้น Math.Round()แต่น่าเสียดายที่นี้ไม่ได้เป็นพฤติกรรมเริ่มต้นสำหรับ หากใช้MidpointRounding.ToEven(ค่าเริ่มต้น) ค่าจะถูกปัดเศษเป็นเลขคู่ที่ใกล้ที่สุด( 1.5ปัดเป็น2แต่2.5จะปัดด้วย2)


14
บนมืออื่น ๆ ที่ใช้away from zeroก็หมายความว่าจะรอบ-1.5 -2
davogotland

2
ใช้ Math.Ceiling ไม่ใช่วิธีปฏิบัติที่ดีในการใช้ Math อ่าน: stackoverflow.com/questions/9221205/… ,
Yakir Manor

3
ฉันพบว่า Math.Round (1.5, 0) ส่งคืน 2
David Sykes เมื่อ

@davogotland คือรอบ 137.5 ถึง 140 ไม่ใช่ 138 ใช่หรือไม่? ฉันหมายถึงการปัดเศษเป็นสิบที่ใกล้ที่สุด?
sam

2
@sam อาจหารด้วย 10 แล้วปัดเศษด้วย Math.Ceiling และสุดท้ายคูณด้วย 10?
davogotland

66
Math.Ceiling

ปัดขึ้นเสมอ (ไปทางเพดาน)

Math.Floor

ปัดลงเสมอ (ไปที่พื้น)

สิ่งที่คุณเป็นเพียงแค่

Math.Round

รอบไหนตามโพสต์นี้


พวกเขาอยู่ที่รอบ 137.5 ถึง 140 ไม่ใช่ 138 หรือไม่? ฉันหมายถึงการปัดเศษเป็นสิบที่ใกล้ที่สุด?
sam

7

คุณต้องไม่Math.Round "ปัดเศษ" ขึ้นเสมอในขณะที่ปัดขึ้นหรือลงขึ้นอยู่กับค่าหลังจุดทศนิยมMath.CeilingCeilingRound


6

มีคู่มือเล่มนี้และก็น่ารักเหมือนกัน:

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

เพียงแค่เพิ่ม 0.5 ให้กับตัวเลขใด ๆ และโยนมันเป็น int (หรือพื้น) และมันจะถูกปัดเศษอย่างถูกต้องทางคณิตศาสตร์: D


มันยังดูน่าสงสัย ประการแรกคำถามถามเกี่ยวกับการปัดเศษขึ้นและประการที่สองเมื่อฉันลองใช้ตอนนี้การใช้คณิตศาสตร์เริ่มต้นรอบ (1.5) รอบเป็น 2 ดังนั้นนี่อาจไม่ใช่สิ่งที่เขาต้องการ
ver

เช่นกันตัวอย่างของคุณผสมจุดทศนิยมกับลูกน้ำทศนิยม ปกติคุณใช้อันไหน (ฉันเดาว่าในสวีเดน) :)
เวอร์ชั่น

โอ๊ะโอใช่ขอโทษ แน่นอนในการเขียนโปรแกรมจุดทศนิยม แต่ในข้อความที่เป็นทางการเราใช้ลูกน้ำทศนิยม ใช่สวีเดน ^^ เกี่ยวกับคำถามและส่วน "ปัดเศษ": ฉันคิดว่านั่นเป็นเพียงความผิดพลาดทางภาษา ในตัวอย่างที่กำหนดโดย op ตัวเลขทศนิยมจะปัดเศษลง
davogotland

@ ฉันไม่ได้ปัดเศษด้วยคณิตศาสตร์รอบที่ฉันทำกับนักแสดง นั่นเป็นเหตุผลว่าทำไมวิธีนี้ถึงใช้มือและค่อนข้างน่ารัก;)
davogotland

5

คุณสามารถใช้ Math.Round ตามที่คนอื่นแนะนำ (แนะนำ) หรือคุณสามารถเพิ่ม 0.5 และส่งไปยัง int (ซึ่งจะทิ้งส่วนทศนิยม)

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

เพียงแค่เตือนความจำ ระวังสองครั้ง

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


2

สิ่งนี้จะปัดเศษขึ้นเป็น 5 ที่ใกล้ที่สุดหรือไม่เปลี่ยนถ้ามันหารด้วย 5 ลงตัวแล้ว

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

2

ฉันกำลังมองหาสิ่งนี้ แต่ตัวอย่างของฉันคือการหาตัวเลขเช่น 4.2769 และวางลงในช่วงที่เป็นเพียง 4.3 ไม่เหมือนกันทุกประการ แต่ถ้าสิ่งนี้ช่วยได้:

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

จากนั้น:

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

ฯลฯ ...


ฉันใช้วิธีนี้ของคุณเพราะฉันต้องการสตริงและ. ToString ("n0") ดูแลการปัดเศษให้ฉัน: 1.5m ToString ("n0") // ส่งกลับ "2"
Nathan Prather



0

หากคุณทำงานกับจำนวนเต็มแทนที่จะเป็นเลขทศนิยมนี่คือวิธี

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

ในที่นี้ทั้ง"numr"และ"denr"เป็นจำนวนเต็มที่ไม่ได้ลงชื่อ




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.