評価を表示する必要があるため、次のように増分が必要です。
数値が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に最も近い値に丸める必要があるように聞こえます。これを行うC#APIにはround
のバージョンがありません(1つのバージョンでは、丸めるのに多数の10進数を使用しますが、これは同じではありません)。
10分の1の整数のみを処理する必要があると仮定すると、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