按 10 的幂缩放十进制值

Edw*_*rey 6 .net decimal

当已知位置数时,按 10 的幂缩放 System.Decimal 值的最佳方法是什么?

value * (decimal)Math.Pow(10, places) 想到,但它有两个缺点:

  1. 它引入了浮点数,这使得随着数字变大而难以推断舍入错误。

  2. 当您尝试做的只是更改已在十进制数据结构中编码的简单比例组件时,进行求幂似乎有些过分。

有没有更好的方法?

rtl*_*ell 3

您可以创建一个 10 的幂表,例如:

var pow10s = new int [] { 1, 10, 100, 1000, 10000, 100000, ... };
Run Code Online (Sandbox Code Playgroud)

然后使用places作为该表的索引:

return value * pow10s[place]
Run Code Online (Sandbox Code Playgroud)

更新: 如果您不希望在尝试索引数组超过 N 个位置时崩溃,您可以采取稍微更复杂的方法,如下所示:

public class Power10Scale
{
    private static readonly int[] Pow10s = {
        1, 10, 100, 1000, 10000, 100000,
    };

    public static int Up(int value, int places)
    {
        return Scale(value, places, (x, y) => x * y);
    }

    public static int Down(int value, int places)
    {
        return Scale(value, places, (x, y) => x / y);
    }

    private static int Scale(int value, int places, Func<int, int, int> operation)
    {
        if (places < Pow10s.Length)
            return operation(value, Pow10s[places]);

        return Scale(
            operation(value, Pow10s[Pow10s.Length - 1]),
            places - (Pow10s.Length - 1),
            operation);
    }
}
Run Code Online (Sandbox Code Playgroud)