找到C#decimal的最低有效位数

时间:2013-02-25 16:31:06

标签: c# decimal

我想找到C#decimal的最低位数字位置,并在该位置设置1,在所有其他位置设置为零。

例如,对于2米,结果将是1米。 对于34米,结果将是1米。 对于0.4米,它将返回0.1米。 对于1200米,我想要100米。

我该怎么做?

我可以使用与https://stackoverflow.com/a/757266/246622类似的内容吗?

(编辑:我删除了令人困惑的2.0米,添加了1200的结果)

3 个答案:

答案 0 :(得分:2)

您可以利用Decimal的实现细节,其指数等于分数中的有效位数。您可以使用GetBits()方法获取指数的值。这使得这个(相当模糊的)代码起作用:

    public static Decimal SignificantFraction(Decimal d) {
        var b = decimal.GetBits(d);
        return new decimal(1, 0, 0, false, (byte)((b[3] >> 16) & 0x7fff));
    }

请注意,这甚至适用于像0.0m这样的角落情况,它会产生0.1米。你没有指定负值会发生什么,所以我在构造函数中对 false 进行了抨击。如果您希望结果为负数,请将其替换为d < 0

答案 1 :(得分:1)

这些方面的内容怎么样?

        decimal number = 1200m;

        decimal result = 1;
        decimal tmp = number;
        while (tmp % 1 != 0)
        {
            result /= 10;
            tmp *= 10;
        }
        if (result > 0 && number != 0)
        {
            tmp = number;
            while (tmp % 10 == 0)
            {
                result *= 10;
                tmp /= 10;
            }
        }

编辑:所以添加1200示例我的解决方案不再那么整洁......但我认为它应该可以做到这一点

答案 2 :(得分:0)

        var t = 1.11111000m;
        //var t = 134000m;

        var tr = t.ToString().Reverse().ToArray();
        char[] ca;
        if (t % 1 > 0)
            ca = tr.SkipWhile(c => c == '0').Select((c, i) => i == 0 ? '1' : c == ',' ? ',' : '0').Reverse().ToArray();
        else
        {
            ca = tr.TakeWhile((c, i) => c == '0' || tr[i - 1] == '0').Reverse().ToArray();
            ca[0] = '1';
        }

        var result = decimal.Parse(new string(ca));