1

如何计算 C# 十进制类型的精度位数?

例如 12.001 = 3 位精度数字。

我想抛出一个错误是存在大于 x 的精度。

谢谢。

4

4 回答 4

3
public int CountDecPoint(decimal d){
   string[] s = d.ToString().Split('.');
   return s.Length == 1 ? 0 : s[1].Length;
}

通常小数分隔符是.,但为了处理不同的文化,这段代码会更好:

public int CountDecPoint(decimal d){
   string[] s = d.ToString().Split(Application.CurrentCulture.NumberFormat.NumberDecimalSeparator[0]);
   return s.Length == 1 ? 0 : s[1].Length;
}
于 2013-08-28T16:21:34.780 回答
2

你可以得到这样的“规模” decimal

static byte GetScale(decimal d)
{
  return BitConverter.GetBytes(decimal.GetBits(d)[3])[2];
}

解释:decimal.GetBits返回一个包含四个值的数组int,我们只取最后一个。如链接页面所述,我们只需要byte组成 this 的四个字节中的倒数第二个int,我们使用BitConverter.GetBytes.

例子:数字的比例3.14m2。的规模3.14000m5。的规模123456m0。的规模123456.0m1


如果代码可以在大端系统上运行,则很可能您必须修改为BitConverter.GetBytes(decimal.GetBits(d)[3])[BitConverter.IsLittleEndian ? 2 : 1]或类似的东西。我没有测试过。请参阅下面 relative_random 的评论。

于 2013-09-03T20:08:20.597 回答
0

我知道我正在复活一个古老的问题,但这是一个不依赖字符串表示并且实际上忽略尾随零的版本。当然,如果这甚至是需要的。

public static int GetMinPrecision(this decimal input)
{
    if (input < 0)
        input = -input;

    int count = 0;
    input -= decimal.Truncate(input);
    while (input != 0)
    {
        ++count;
        input *= 10;
        input -= decimal.Truncate(input);
    }

    return count;
}
于 2016-10-21T12:53:10.793 回答
0

我想抛出一个错误是存在大于 x 的精度

这看起来像最简单的方法:

void AssertPrecision(decimal number, int decimals)
{
    if (number != decimal.Round(number, decimals, MidpointRounding.AwayFromZero))
        throw new Exception()
};
于 2021-03-08T12:49:53.620 回答