คุณจะปัดเศษทศนิยมเป็นสองใน C # ได้อย่างไร


คำตอบ:


629

นี่คือตัวอย่างบางส่วน:

decimal a = 1.994444M;

Math.Round(a, 2); //returns 1.99

decimal b = 1.995555M;

Math.Round(b, 2); //returns 2.00

คุณอาจต้องการดูการปัดเศษแบงเกอร์ / รอบต่อเนื่องด้วยโอเวอร์โหลดต่อไปนี้:

Math.Round(a, 2, MidpointRounding.ToEven);

มีข้อมูลเพิ่มเติมเกี่ยวกับมันนี่


51
คุณควรชี้แจงว่า MidPointRounding.ToEven IS เป็นค่าเริ่มต้น หากคุณต้องการ AwayFromZero คุณจะต้องใช้งานเกินพิกัด
Brian Vander Plaats

5
หากคุณต้องการปัดเศษทศนิยมสูงสุด 2 ตำแหน่งให้เพิ่ม0.005จำนวนก่อนที่จะปัดเศษ ในทำนองเดียวกันในการปัดเศษลบออก0.005ก่อนส่งผ่านไปยังMath.Roundฟังก์ชัน
orad

4
เหตุผลที่. NET เริ่มต้นที่MidPointRounding.ToEven(หรือ "การปัดเศษแบ๊งเกอร์ส") เป็นเพราะเราทุกคนเรียนรู้ที่จะออกรอบในโรงเรียนที่. 0.5 รอบทำให้เกิดการปัดเศษมากเกินไป นี่เป็นปัญหาเมื่อจัดการกับเงินการคำนวณภาษี ฯลฯ
ดำเนินการ


33

โดยส่วนตัวฉันไม่เคยปัดเศษอะไรเลย เก็บไว้เป็นเด็ดเดี่ยวที่สุดเนื่องจากการปัดเศษเป็นปลาเฮอริ่งแดงใน CS แต่คุณต้องการจัดรูปแบบข้อมูลสำหรับผู้ใช้ของคุณและท้ายที่สุดฉันพบว่านั่นstring.Format("{0:0.00}", number)เป็นวิธีการที่ดี


วิธีนี้ใช้งานได้ดีกว่าสำหรับจุดประสงค์ในการแสดงผลโดยเฉพาะอย่างยิ่งสำหรับเงินเนื่องจาก£ 5.4 (พร้อม Math.round) นั้นดูไม่ดีเท่ากับ£ 5.40 (ด้วยวิธีนี้)
ปีเตอร์กอร์ดอน

ฉันเคยลองมาก่อน string รูปแบบ ("0: 0.00", number) แต่มันไม่ทำงาน วงเล็บเหลี่ยมเหล่านั้นสำคัญมากดังนั้น string.Format ("{0: 0.00}", number) จึงทำงานได้
FrenkyB

8
@FrenkyB เมื่อคุณพูดว่า 'square brackets' ฉันหวังว่าคุณหมายถึงเครื่องหมายวงเล็บ
Mathemats

รอบนี้ยัง 1.009 => 1.01
Donny V.

30

หากคุณต้องการสตริง

> (1.7289).ToString("#.##")
"1.73"

หรือทศนิยม

> Math.Round((Decimal)x, 2)
1.73m

แต่จำไว้! การปัดเศษไม่ได้เป็นการแจกแจงเช่น round(x*y) != round(x) * round(y). ดังนั้นอย่าทำการปัดเศษจนสิ้นสุดการคำนวณมิฉะนั้นคุณจะเสียความแม่นยำ


14

Wikipedia มีหน้าดีในการปัดเศษโดยทั่วไป

ภาษา. NET (ที่มีการจัดการ) ทั้งหมดสามารถใช้กลไกการปัดเศษ (CLR) ของการเรียกใช้ภาษาทั่วไป ตัวอย่างเช่นวิธีการMath.Round () (ดังกล่าวข้างต้น) ช่วยให้นักพัฒนาสามารถระบุประเภทของการปัดเศษ (Round-to- Evenหรือ Away-from-zero) Convert.ToInt32 () วิธีการและรูปแบบของการใช้งานตลอดไปแม้กระทั่ง The Ceiling ()และFloor ()วิธีการที่เกี่ยวข้อง

คุณสามารถปัดเศษด้วยการจัดรูปแบบตัวเลขแบบกำหนดเองได้เช่นกัน

โปรดทราบว่าDecimal.Round ()ใช้วิธีที่แตกต่างจาก Math.Round ();

นี่เป็นวิธีที่มีประโยชน์ในอัลกอริทึมการปัดเศษของนายธนาคาร ดูหนึ่งในบทความตลกของเรย์มอนด์ที่นี่เกี่ยวกับการปัดเศษ ...


13

// แปลงได้มากถึงสองตำแหน่งทศนิยม

String.Format("{0:0.00}", 140.6767554);        // "140.67"
String.Format("{0:0.00}", 140.1);             // "140.10"
String.Format("{0:0.00}", 140);              // "140.00"

Double d = 140.6767554;
Double dc = Math.Round((Double)d, 2);       //  140.67

decimal d = 140.6767554M;
decimal dc = Math.Round(d, 2);             //  140.67

=========

// just two decimal places
String.Format("{0:0.##}", 123.4567);      // "123.46"
String.Format("{0:0.##}", 123.4);         // "123.4"
String.Format("{0:0.##}", 123.0);         // "123"

ยังสามารถรวม "0" กับ "#"

String.Format("{0:0.0#}", 123.4567)       // "123.46"
String.Format("{0:0.0#}", 123.4)          // "123.4"
String.Format("{0:0.0#}", 123.0)          // "123.0"

1
String.Format ("{0: 0.00}", 140.6767554); ! = "140.67" จริง ๆ แล้วทำให้เป็น "140.68" - การปัดเศษขึ้น
AndyT

7

ฉันรู้ว่าเป็นคำถามที่เก่าแก่ แต่โปรดทราบความแตกต่างดังต่อไปนี้ระหว่างรอบคณิตศาสตร์และString รอบรูปแบบ :

decimal d1 = (decimal)1.125;
Math.Round(d1, 2).Dump();   // returns 1.12
d1.ToString("#.##").Dump(); // returns "1.13"

decimal d2 = (decimal)1.1251;
Math.Round(d2, 2).Dump();   // returns 1.13
d2.ToString("#.##").Dump(); // returns "1.13"

6

ใช้สำหรับปัดเศษทศนิยม 2 ตำแหน่งใน C #:

label8.Text = valor_cuota .ToString("N2") ;

ใน VB.NET:

 Imports System.Math
 round(label8.text,2)

5

หากคุณต้องการปัดเศษตัวเลขคุณสามารถได้ผลลัพธ์ที่แตกต่างกันโดยขึ้นอยู่กับ: วิธีที่คุณใช้ฟังก์ชัน Math.Round () (สำหรับปัดเศษขึ้นหรือปัดเศษลง) คุณกำลังทำงานกับตัวเลขทวีคูณและ / หรือลอย และคุณใช้การปัดเศษจุดกึ่งกลาง โดยเฉพาะอย่างยิ่งเมื่อใช้กับการดำเนินการภายในของมันหรือตัวแปรรอบที่มาจากการดำเนินการ สมมุติว่าคุณต้องการคูณจำนวนสองตัวเหล่านี้: 0.75 * 0.95 = 0.71250.7125 ขวา? ไม่ได้อยู่ใน C #

มาดูกันว่าจะเกิดอะไรขึ้นถ้าคุณต้องการปัดเศษทศนิยม 3:

double result = 0.75d * 0.95d; // result = 0.71249999999999991
double result = 0.75f * 0.95f; // result = 0.71249997615814209

result = Math.Round(result, 3, MidpointRounding.ToEven); // result = 0.712. Ok
result = Math.Round(result, 3, MidpointRounding.AwayFromZero); // result = 0.712. Should be 0.713

อย่างที่คุณเห็นรอบแรก () ถูกต้องหากคุณต้องการปัดเศษจุดกึ่งกลาง แต่รอบที่สอง () มันผิดถ้าคุณต้องการปัดเศษขึ้น

สิ่งนี้ใช้กับจำนวนลบ:

double result = -0.75 * 0.95;  //result = -0.71249999999999991
result = Math.Round(result, 3, MidpointRounding.ToEven); // result = -0.712. Ok
result = Math.Round(result, 3, MidpointRounding.AwayFromZero); // result = -0.712. Should be -0.713

ดังนั้น IMHO คุณควรสร้างฟังก์ชั่นการตัดของคุณเองสำหรับ Math.Round () ที่เหมาะสมกับความต้องการของคุณ ฉันสร้างฟังก์ชั่นซึ่งพารามิเตอร์ 'roundUp = true' หมายถึงการปัดเศษให้เป็นจำนวนมากขึ้นไปอีก นั่นคือ: 0.7125 รอบถึง 0.713 และ -0.7125 รอบถึง -0.712 (เพราะ -0.712> -0.713) นี่คือฟังก์ชั่นที่ฉันสร้างขึ้นและใช้ได้กับจำนวนทศนิยมใด ๆ :

double Redondea(double value, int precision, bool roundUp = true)
{
    if ((decimal)value == 0.0m)
        return 0.0;

    double corrector = 1 / Math.Pow(10, precision + 2);

    if ((decimal)value < 0.0m)
    {
        if (roundUp)
            return Math.Round(value, precision, MidpointRounding.ToEven);
        else
            return Math.Round(value - corrector, precision, MidpointRounding.AwayFromZero);
    }
    else
    {
        if (roundUp)
            return Math.Round(value + corrector, precision, MidpointRounding.AwayFromZero);
        else
            return Math.Round(value, precision, MidpointRounding.ToEven);
    }
}

ตัวแปร 'ตัวแก้ไข' สำหรับแก้ไขความไม่ถูกต้องของการทำงานด้วยตัวเลขลอยหรือสอง


4

สิ่งหนึ่งที่คุณอาจต้องการตรวจสอบคือกลไกการปัดเศษของคณิตศาสตร์รอบ:

http://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx

นอกจากนั้นฉันขอแนะนำวิธีการ Math.Round (inputNumer, numberOfPlaces) เหนือ * 100/100 เพราะมันสะอาดกว่า


3

คุณควรระบุจำนวนหลักที่คุณต้องการปัดเศษเพื่อใช้ Math.Round (YourNumber, 2)

คุณสามารถอ่านเพิ่มเติมที่นี่




1

มีสถานการณ์แปลก ๆ ที่ฉันมีตัวแปรทศนิยมเมื่อทำการจัดลำดับ 55.50 จะตั้งค่าเริ่มต้นทางคณิตศาสตร์เป็น 55.5 เสมอ แต่ในขณะที่ระบบลูกค้าของเราคาดหวังอย่างจริงจังว่าจะมี 55.50 ด้วยเหตุผลบางอย่างและพวกเขาคาดว่าจะเป็นทศนิยม นั่นคือตอนที่ฉันได้เขียนตัวช่วยด้านล่างซึ่งจะแปลงค่าทศนิยมใด ๆ ที่เป็นตัวเลข 2 หลักด้วยเลขศูนย์แทนการส่งสตริง

public static class DecimalExtensions
{
    public static decimal WithTwoDecimalPoints(this decimal val)
    {
        return decimal.Parse(val.ToString("0.00"));
    }
}

การใช้งานควรจะเป็น

var sampleDecimalValueV1 = 2.5m;
Console.WriteLine(sampleDecimalValueV1.WithTwoDecimalPoints());

decimal sampleDecimalValueV1 = 2;
Console.WriteLine(sampleDecimalValueV1.WithTwoDecimalPoints());

เอาท์พุท:

2.50
2.00

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