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


103

ฉันต้องแสดงการให้คะแนนและสำหรับสิ่งนั้นฉันต้องการการเพิ่มดังนี้:

ถ้าตัวเลขเท่ากับ 1.0 มันควรจะเท่ากับ 1
ถ้าตัวเลขคือ 1.1 ควรเท่ากับ 1
ถ้าตัวเลขคือ 1.2 ควรเท่ากับ 1
ถ้าตัวเลขคือ 1.3 ควรจะเท่ากับ 1.5
ถ้าตัวเลขเท่ากับ 1.4 ควรเท่ากับ 1.5
ถ้าจำนวน 1.5 ควรเท่ากับ 1.5
ถ้าจำนวน 1.6 ควรเท่ากับ 1.5
ถ้าจำนวน 1.7 ควรเท่ากับ 1.5
ถ้าจำนวน 1.8 ควรเท่ากับ 2.0
ถ้าจำนวน 1.9 ควรเท่ากับ 2.0
ถ้าตัวเลขคือ 2.0 ควรเท่ากับ 2.0
ถ้าตัวเลขเท่ากับ 2.1 ควรเท่ากับ 2.0
และอื่น ๆ ...

มีวิธีง่ายๆในการคำนวณค่าที่ต้องการหรือไม่?


"และอื่น ๆ ... " รวมถึงตัวเลข จำกัด ที่ใกล้เคียงกับค่าสูงสุดที่แสดงได้หรือไม่
chux - คืนสถานะ Monica

คำตอบ:


208

คูณคะแนนของคุณด้วย 2 จากนั้นปัดเศษโดยใช้Math.Round(rating, MidpointRounding.AwayFromZero)จากนั้นหารค่านั้นด้วย 2

Math.Round(value * 2, MidpointRounding.AwayFromZero) / 2


4
ฉันไม่ต้องการพิมพ์สำหรับหุ่นฉันต้องพิมพ์เพื่อความฉลาด
Neil N

3
ไม่สมบูรณ์! แล้วจำนวนเต็มล้น! คุณสามารถคำนวณจำนวนเต็มได้เพียงครึ่งเดียว
Elazar Leibovich

2
@Elazar - ถ้าคุณได้รับการจัดอันดับสูงถึง 1,073,741,823rd ฉันไม่สามารถนึกถึงกรณีการใช้งานเพียงครั้งเดียวที่คุณจะสนใจว่ามันเป็น "หนึ่งพันล้านหนึ่งครึ่ง" หรือ "หนึ่งพันล้านหนึ่ง" - หากนั่นเป็นปัญหาจริงๆ แล้วมีบางอย่างที่ผิดปกติกับแผนการจัดอันดับ :)
John Rasch

4
หารก่อนแล้วคูณ วิธีนี้จะช่วยขจัดปัญหาการล้นและยังช่วยให้คุณสามารถปัดเศษเป็นตัวเลขโดยพลการ
เบญจพล

8
@ เบ็นโจลการหารก่อนแล้วจึงปัดเศษจะทำให้มันปัดเศษเป็นตัวประกอบที่ใกล้ที่สุดของ 2 แทนที่จะเป็นตัวประกอบของครึ่งเดียว ไม่ถูกต้อง.
Nacht

66

คูณด้วย 2 รอบแล้วหารด้วย 2

ถ้าคุณต้องการไตรมาสที่ใกล้ที่สุดให้คูณด้วย 4 หารด้วย 4 ฯลฯ


16

นี่คือสองวิธีที่ฉันเขียนไว้ซึ่งจะปัดเศษขึ้นหรือลงเป็นค่าใดก็ได้

public static Double RoundUpToNearest(Double passednumber, Double roundto)
{
    // 105.5 up to nearest 1 = 106
    // 105.5 up to nearest 10 = 110
    // 105.5 up to nearest 7 = 112
    // 105.5 up to nearest 100 = 200
    // 105.5 up to nearest 0.2 = 105.6
    // 105.5 up to nearest 0.3 = 105.6

    //if no rounto then just pass original number back
    if (roundto == 0)
    {
        return passednumber;
    }
    else
    {
        return Math.Ceiling(passednumber / roundto) * roundto;
    }
}

public static Double RoundDownToNearest(Double passednumber, Double roundto)
{
    // 105.5 down to nearest 1 = 105
    // 105.5 down to nearest 10 = 100
    // 105.5 down to nearest 7 = 105
    // 105.5 down to nearest 100 = 100
    // 105.5 down to nearest 0.2 = 105.4
    // 105.5 down to nearest 0.3 = 105.3

    //if no rounto then just pass original number back
    if (roundto == 0)
    {
        return passednumber;
    }
    else
    {
        return Math.Floor(passednumber / roundto) * roundto;
    }
}

2

มีหลายตัวเลือก หากประสิทธิภาพเป็นปัญหาให้ทดสอบเพื่อดูว่าตัวใดทำงานได้เร็วที่สุดในลูปขนาดใหญ่

double Adjust(double input)
{
    double whole = Math.Truncate(input);
    double remainder = input - whole;
    if (remainder < 0.3)
    {
        remainder = 0;
    }
    else if (remainder < 0.8)
    {
        remainder = 0.5;
    }
    else
    {
        remainder = 1;
    }
    return whole + remainder;
}

สิ่งนี้ควรใช้งานได้ แต่ก็ไม่ได้สวยงามเหมือนกับโซลูชันบางอย่างที่ให้มา การคูณและการใช้ไลบรารีระบบนั้นเซ็กซี่
captncraig

ประสิทธิภาพมักจะสำคัญกว่าและอาจใช้เวลาน้อยกว่าการแก้ปัญหาการคูณและการหาร
John Fisher

3
รหัสนี้ไม่ถูกต้อง เนื่องจากเลขคณิตที่มีคู่มักจะมีข้อผิดพลาดในการปัดเศษเล็กน้อยการดำเนินการเช่น 4.8 - 4.0 อาจให้ตัวอย่างเช่น 0.799999 ... ในกรณีนี้รหัสด้านบนจะปัดเศษเป็น 4.5 ยังดีกว่าที่จะใช้ Math.Floor แทน Math.Truncate เนื่องจากตอนนี้ตัวเลขติดลบจะไม่ถูกปัดเศษ ฉันชอบคำตอบที่ได้รับการยอมรับมากกว่าเพราะง่ายกว่าและไม่ค่อยมีข้อผิดพลาดในการใช้งาน
Accipitridae

1
decimal d = // your number..

decimal t = d - Math.Floor(d);
if(t >= 0.3d && t <= 0.7d)
{
    return Math.Floor(d) + 0.5d;
}
else if(t>0.7d)
    return Math.Ceil(d);
return Math.Floor(d);

1

ดูเหมือนว่าคุณต้องปัดเศษเป็น 0.5 ที่ใกล้ที่สุด ฉันไม่เห็นเวอร์ชันของroundC # API ที่ทำสิ่งนี้ได้ (เวอร์ชันหนึ่งใช้ตัวเลขทศนิยมจำนวนหนึ่งเพื่อปัดเศษซึ่งไม่เหมือนกัน)

สมมติว่าคุณต้องจัดการกับจำนวนเต็มสิบเท่านั้นก็เพียงพอที่จะคำนวณround (num * 2) / 2ได้ หากคุณใช้ทศนิยมที่แม่นยำตามอำเภอใจมันจะยุ่งยากกว่า หวังว่าคุณจะไม่ทำ


0

ฉันมีปัญหากับปัญหานี้เช่นกัน ฉันเขียนโค้ดใน Actionscript 3.0 เป็นหลักซึ่งเป็นการเข้ารหัสพื้นฐานสำหรับแพลตฟอร์ม Adobe Flash แต่มีความคล้ายคลึงกันในภาษา:

วิธีแก้ปัญหาที่ฉันคิดขึ้นมีดังต่อไปนี้:

//Code for Rounding to the nearest 0.05
var r:Number = Math.random() * 10;  // NUMBER - Input Your Number here
var n:int = r * 10;   // INTEGER - Shift Decimal 2 places to right
var f:int = Math.round(r * 10 - n) * 5;// INTEGER - Test 1 or 0 then convert to 5
var d:Number = (n + (f / 10)) / 10; //  NUMBER - Re-assemble the number

trace("ORG No: " + r);
trace("NEW No: " + d);

สวยมากเลย สังเกตการใช้ 'Numbers' และ 'Integers' และวิธีการประมวลผล

โชคดี!


0
Public Function Round(ByVal text As TextBox) As Integer
    Dim r As String = Nothing
    If text.TextLength > 3 Then
        Dim Last3 As String = (text.Text.Substring(text.Text.Length - 3))
        If Last3.Substring(0, 1) = "." Then
            Dim dimcalvalue As String = Last3.Substring(Last3.Length - 2)
            If Val(dimcalvalue) >= 50 Then
                text.Text = Val(text.Text) - Val(Last3)
                text.Text = Val(text.Text) + 1
            ElseIf Val(dimcalvalue) < 50 Then
                text.Text = Val(text.Text) - Val(Last3)
            End If
        End If
    End If
    Return r
End Function

5
รหัสนี้ไม่เหมือน C # ตามที่ต้องการในคำถาม มันทำอะไร? โปรดให้คำอธิบายบางอย่างแทนที่จะเป็นเพียงโค้ดส่วนหนึ่งในภาษาที่ไม่ได้ระบุ
AdrianHHH

-1

วิธีที่ถูกต้องในการดำเนินการนี้คือ:

  public static Decimal GetPrice(Decimal price)
            {
                var DecPrice = price / 50;
                var roundedPrice = Math.Round(DecPrice, MidpointRounding.AwayFromZero);
                var finalPrice = roundedPrice * 50;

                return finalPrice;

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