Как мне округлить до ближайших 0,5?
Я должен отображать рейтинги и для этого мне нужны приращения следующим образом:
Если число равно 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
и так далее...
есть ли простой способ вычислить необходимые значения?
9 ответов:
умножить свой рейтинг на 2, затем с помощью
Math.Round(rating, MidpointRounding.AwayFromZero)
, затем разделить это значение на 2.
Math.Round(value * 2, MidpointRounding.AwayFromZero) / 2)
умножить на 2, округлить, затем разделить на 2
Если вы хотите ближайший квартал, умножаем на 4, делим на 4, и т. д.
вот несколько методов, которые я написал, которые всегда будут округляться вверх или вниз до любого значения.
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; } }
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);
Похоже, вам нужно округлить до ближайшего 0,5. Я не вижу никакой версии
round
в API C#, который делает это (одна версия принимает количество десятичных цифр для округления, что не одно и то же).предполагая, что вам нужно иметь дело только с целыми числами десятых, достаточно вычислить
round (num * 2) / 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; }
правильный способ сделать это:
public static Decimal GetPrice(Decimal price) { var DecPrice = price / 50; var roundedPrice = Math.Round(DecPrice, MidpointRounding.AwayFromZero); var finalPrice = roundedPrice * 50; return finalPrice; }
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
У меня были трудности с этой проблемой, а также. Я кодирую в основном в 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);
вот и все. Обратите внимание на использование "чисел" и "целых чисел" и способ их обработки.
Удачи!