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