如何计算C#十进制类型的精确数字?
e.g。 12.001 = 3个精确数字。
我想抛出一个错误,就是存在大于x的精度。
感谢。
答案 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
的比例为2
。 3.14000m
的比例为5
。 123456m
的比例为0
。 123456.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()
};