如何计算 C# 十进制类型的精度位数?
例如 12.001 = 3 位精度数字。
我想抛出一个错误是存在大于 x 的精度。
谢谢。
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;
}
你可以得到这样的“规模” decimal
:
static byte GetScale(decimal d)
{
return BitConverter.GetBytes(decimal.GetBits(d)[3])[2];
}
解释:decimal.GetBits
返回一个包含四个值的数组int
,我们只取最后一个。如链接页面所述,我们只需要byte
组成 this 的四个字节中的倒数第二个int
,我们使用BitConverter.GetBytes
.
例子:数字的比例3.14m
是2
。的规模3.14000m
是5
。的规模123456m
是0
。的规模123456.0m
是1
。
如果代码可以在大端系统上运行,则很可能您必须修改为BitConverter.GetBytes(decimal.GetBits(d)[3])[BitConverter.IsLittleEndian ? 2 : 1]
或类似的东西。我没有测试过。请参阅下面 relative_random 的评论。
我知道我正在复活一个古老的问题,但这是一个不依赖字符串表示并且实际上忽略尾随零的版本。当然,如果这甚至是需要的。
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;
}
我想抛出一个错误是存在大于 x 的精度
这看起来像最简单的方法:
void AssertPrecision(decimal number, int decimals)
{
if (number != decimal.Round(number, decimals, MidpointRounding.AwayFromZero))
throw new Exception()
};