首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用.5集合到最近的C#

如何使用.5集合到最近的C#
EN

Stack Overflow用户
提问于 2016-06-08 08:46:37
回答 4查看 4.5K关注 0票数 1

使用时间时钟系统--大部分时间时钟--最后的结果如下所示:

0.266666666666。

现在,我想将所有的数字集合到"next .5值“,使0.2666666666变为0.5。

示例:

代码语言:javascript
复制
1.4 => Should become 1.5
1.45 => Should become 1.5
1.466666666 => Should become 1.5
1.0 => Should remain 1.0
1.6 => Should become 2.0

这些数字需要总是被舍入。

对于如何在C#中实现这一点,我将非常感激!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-06-08 09:59:08

我冒昧地假设负值是一个有效的输入,并且期望的行为总是舍弃零;在负输入的情况下,所有其他有效的答案都会趋向于零。

执行情况不佳,但有效且易于理解:

代码语言:javascript
复制
public static double Round(double d)
{
    var absoluteValue = Math.Abs(d);
    var integralPart = (long)absoluteValue;
    var decimalPart = absoluteValue - integralPart;
    var sign = Math.Sign(d);

    double roundedNumber;

    if (decimalPart > 0.5)
    {
        roundedNumber = integralPart + 1;
    }
    else if (decimalPart == 0)
    {
        roundedNumber = absoluteValue;
    }
    else
    {
        roundedNumber = integralPart + 0.5;
    }

    return sign * roundedNumber;
}
票数 2
EN

Stack Overflow用户

发布于 2016-06-08 08:49:47

我想你想要这样的东西:

代码语言:javascript
复制
Math.Ceiling(value / 0.5) * 0.5
票数 6
EN

Stack Overflow用户

发布于 2016-06-08 08:56:25

要使解决方案通用地传递所需的目标:

代码语言:javascript
复制
public static class Ext
{
    public static decimal RoundUp(this decimal num, decimal step = 0.5m)
    {
        /*
         * check the range of num and step
           according to your requirement
           e.g. num > 0 and step > 0
         */

        var result = Math.Floor(num);
        while (result < num)
        {
            result += step;
        }
        return result;
    }
}

//使用

代码语言:javascript
复制
1.4m.RoundUp();   //1.5
1.0m.RoundUp();   //1.0
1.4m.RoundUp(0.2m);  //1.4
1.5m.RoundUp(0.2m);  //1.6
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37697553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档