计算精确数字

时间:2013-08-28 16:18:47

标签: c# decimal

如何计算C#十进制类型的精确数字?

e.g。 12.001 = 3个精确数字。

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

感谢。

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

您可以像这样获得decimal的“比例”:

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

说明:decimal.GetBits返回一个包含四个int值的数组,我们只采用最后一个值。如链接页面所述,我们只需要构成此byte的四个字节中的倒数第二个int,我们使用BitConverter.GetBytes执行此操作。

示例:数字3.14m的比例为23.14000m的比例为5123456m的比例为0123456.0m的比例为1


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

答案 2 :(得分: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;
}

答案 3 :(得分:0)

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

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

void AssertPrecision(decimal number, int decimals)
{
    if (number != decimal.Round(number, decimals, MidpointRounding.AwayFromZero))
        throw new Exception()
};