我有一个Double值:
double a = 4.5565;
计算小数点后位数的最简单方法是什么(本例中为4)。
我知道我可以转换为字符串并进行拆分并获取长度。但是有更简单的方法吗?
答案 0 :(得分:19)
没有简单的方法,特别是因为数学上的数字位数可能远远超过显示数字。例如,4.5565实际上存储为4.556499999999999772626324556767940521240234375
(感谢harold计算)。你不太可能找到解决这个问题的有用方法。
修改强>
你可以提出一些算法,如下所示:如果,当你计算十进制表示时,你会连续找到一定数量的9(或零),你就会向上舍入(或者在一系列9s(或零)开始之前的最后一个位置。我怀疑你会发现这条道路比你预期的更麻烦。
答案 1 :(得分:12)
var precision = 0;
var x = 1.345678901m;
while (x*(decimal)Math.Pow(10,precision) !=
Math.Round(x*(decimal)Math.Pow(10,precision)))
precision++;
precision
将等于十进制值的有效位数(设置x到1.23456000将导致精度为5,即使最初在文字中指定了8位数)。这与小数位数成比例地执行。它仅计算小数位数;你可以通过取Math.Log10(x)的整数部分来计算小数点左边的位数。它最适用于小数,因为它们具有更好的值精度,因此舍入误差更小。
答案 2 :(得分:4)
写一个函数
int CountDigitsAfterDecimal(double value)
{
bool start = false;
int count = 0;
foreach (var s in value.ToString())
{
if (s == '.')
{
start = true;
}
else if (start)
{
count++;
}
}
return count;
}
答案 3 :(得分:3)
我认为String解决方案最好:((a-(int)a)+"").length-2
答案 4 :(得分:1)
我认为这可能是一个解决方案:
private static int getDecimalCount(double val)
{
int i=0;
while (Math.Round(val, i) != val)
i++;
return i;
}
double val9 = 4.5565d; int count9 = getDecimalCount(val9);//result: 4
抱歉重复 - > https://stackoverflow.com/a/35238462/1266873
答案 5 :(得分:1)
基于詹姆斯的答案更加清楚:
int num = dValue.ToString().Length - (((int)dValue).ToString().Length + 1);
num是小数点后的确切位数。 不包括0(25.52 0000 ) 在这种情况下,您将获得num = 2
答案 6 :(得分:0)
我可能会在需要时使用此代码,
myDoubleNumber.ToString("R").Split('.')[1].Length
"R"
这里是Round Trip Format Specifier
我们首先需要检查索引边界。
答案 7 :(得分:0)
另一种解决方案是使用一些字符串函数:
private int GetSignificantDecimalPlaces(decimal number, bool trimTrailingZeros = true)
{
string stemp = Convert.ToString(number);
if (trimTrailingZeros)
stemp = stemp.TrimEnd('0');
return stemp.Length - 1 - stemp.IndexOf(
Application.CurrentCulture.NumberFormat.NumberDecimalSeparator);
}
记住要使用System.Windows.Forms来访问Application.CurrentCulture