怎么调整到最接近的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

诸如此类。

是否有一种简单的方法来计算所需的值?

158096 次浏览

将你的等级乘以2,然后用 Math.Round(rating, MidpointRounding.AwayFromZero)四舍五入,然后再除以2。

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

乘以2,然后除以2

如果你想要最近的四分之一,乘以4,除以4等

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可以做到这一点(一个版本需要四舍五入到多个小数位,这是不一样的)。

假设您只需要处理十分之一的整数,那么计算 round (num * 2) / 2就足够了。如果使用任意精确的小数,就会变得更加棘手。希望你不会。

我在这个问题上也遇到了困难。 我主要使用 Actionscript 3.0编写代码,这是 Adobe Flash 平台的基础代码,但在语言方面也有相似之处:

The solution I came up with is the following:

//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 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;
}
}
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

This answer is taken from Rosdi Kasim's comment in the answer that John Rasch provided.

约翰的回答有效,但确实有溢出的可能性。

以下是我对罗斯蒂代码的解释:

我还把它放在一个扩展中,使它易于使用。扩展不是必需的,可以作为一个函数使用,没有问题。

<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

The usage would then be:

Dim newValue = CDec(1.26).ToHalf

这将返回1.5

这几行代码将一个 float dx 按到最近的快照:

if (snap <= 1f)
dx = Mathf.Floor(dx) + (Mathf.Round((dx - Mathf.Floor(dx)) * (1f / snap)) * snap);
else
dx = Mathf.Round(dx / snap) * snap;

因此,如果管理单元是0.5,则值四舍五入到最接近的0.5值(1.37到1.5) ,如果是0.02,则值四舍五入到最接近的0.02((1.37到1.38))。如果管理单元是3,则值四舍五入到最接近的3(7.4到6,7.6到9)等等。.我用它来快速捕捉对象在场景中的统一,因为统一默认捕捉似乎不适合我。