如何按以下顺序舍入到最接近的0.5

时间:2013-10-14 07:06:47

标签: .net

我必须显示评级,为此我需要增加如下:

如果数字为1.0,则应等于1

如果数字为1.1,则应等于1

如果数字是1.2应该等于1.5

如果数字是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

依旧......

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

4 个答案:

答案 0 :(得分:2)

由于1.2比1.5更接近1.0,所以你并没有真正四舍五入到最接近的0.5,标准的Math.Round()函数并不能真正为你完成整个工作。

当序列中有.2时,您需要稍微移动该值。

尝试使用:

var shiftBy = ((int)Math.Round(v*10) % 10 == 2) ? 0.1 : 0;

var nearest = Math.Round((v + shiftBy)*2)/2.0;

答案 1 :(得分:1)

这种方法可以绕v

v = Math.Round(v*2.0) / 2.0;

但这会将1.2 向下1.0。 (有点奇怪的是,1.2和1.7都应该舍入到1.5)

答案 2 :(得分:0)

试试这个:

r = Math.Floor(v) + 0.5*( 
                        Math.Floor(v + 0.8) - Math.Floor(v) 
                      + Math.Floor(v + 0.2) - Math.Floor(v) )

这可以简化为:

r = 0.5 * ( Math.Floor(v + 0.8) + Math.Floor(v + 0.2) )

答案 3 :(得分:0)

double nr = 15.9;
double rounded = (int)nr;
double rest = Math.Round(nr - rounded, 5);
if(0.2 <= rest && rest <= 0.7)
  rounded += 0.5;
else if (0.7 < rest)
  rounded += 1;

用15.0测试&gt; 15.9。似乎工作正常。

相关问题