我必须显示评级,为此我需要增加如下:
如果数字为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
等等...
是否有一种简单的方法来计算所需的值?
答案 0 :(得分:181)
将您的评分乘以2,然后使用Math.Round(rating, MidpointRounding.AwayFromZero)
进行舍入,然后将该值除以2.
Math.Round(value * 2, MidpointRounding.AwayFromZero) / 2
答案 1 :(得分:59)
乘以2,舍入,然后除以2
如果你想要最近的四分之一,乘以4,除以4,等等
答案 2 :(得分:14)
以下是我编写的一些方法,它们总是向上或向下舍入到任何值。
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;
}
}
答案 3 :(得分: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);
答案 4 :(得分:1)
有几种选择。如果考虑性能,请测试它们以查看哪个在大循环中最快。
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;
}
答案 5 :(得分:1)
听起来你需要四舍五入到最接近的0.5。我在C#API中看到没有round
的版本执行此操作(一个版本需要使用多个十进制数字来舍入,这不是一回事。)
假设您只需要处理十分之一的整数,那么计算round (num * 2) / 2
就足够了。如果你使用任意精确的小数,它会变得更加棘手。让我们希望你不要。
答案 6 :(得分:1)
这些代码行将浮动 dx 捕捉到最近的捕捉:
if (snap <= 1f)
dx = Mathf.Floor(dx) + (Mathf.Round((dx - Mathf.Floor(dx)) * (1f / snap)) * snap);
else
dx = Mathf.Round(dx / snap) * snap;
因此,如果 snap 为 0.5,则值四舍五入到最接近的 0.5 值(1.37 变为 1.5),如果是 0.02,则值四舍五入到最接近的 0.02((1.37 变为 1.38))。如果 snap 为 3,则值四舍五入到最接近的 3(7.4 到 6,7.6 到 9)等等......我用它来快速捕捉场景中的对象,因为统一默认捕捉对我来说似乎不太好.
答案 7 :(得分: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
答案 8 :(得分:-1)
我也遇到了这个问题。 我主要在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);
几乎就是这样。 注意使用'Numbers'和'Integers'以及它们的处理方式。
祝你好运!
答案 9 :(得分:-1)
正确的方法是:
public static Decimal GetPrice(Decimal price)
{
var DecPrice = price / 50;
var roundedPrice = Math.Round(DecPrice, MidpointRounding.AwayFromZero);
var finalPrice = roundedPrice * 50;
return finalPrice;
}
答案 10 :(得分:-1)
此答案摘自Rosdi Kasim在John Rasch提供的答案中的评论。
约翰的答案有效,但确实有溢出的可能性。
这是我的Rosdi代码版本:
我也将其放在扩展名中以使其易于使用。该扩展不是必需的,可以毫无问题地用作功能。
<Extension>
Public Function ToHalf(value As Decimal) As Decimal
Dim integerPart = Decimal.Truncate(value)
Dim fractionPart = value - Decimal.Truncate(integerPart)
Dim roundedFractionPart = Math.Round(fractionPart * 2, MidpointRounding.AwayFromZero) / 2
Dim newValue = integerPart + roundedFractionPart
Return newValue
End Function
用法如下:
Dim newValue = CDec(1.26).ToHalf
这将返回1.5