Nir*_*Nir 4 c# mathematical-expressions
我希望用给定的双数来返回它的"大小"(称为| number |,或者在点之后没有数字的数字),例如:
12.324654 -> 2
12 -> 2
0.99 -> 0
1.01 -> 1
901 -> 3
-0.99 -> 0
-9.999 -> 1
Run Code Online (Sandbox Code Playgroud)
必须有一个函数是.net,我不熟悉这样做..
谢谢.
尝试log 10(max(abs(number),0.5))+ 1向下舍入.
或者,在实际的C#语法中:
(int)(Math.Log10(Math.Max(Math.Abs(number), 0.5)) + 1)
Run Code Online (Sandbox Code Playgroud)
好的,这是怎么回事?
在首先, p =日志10(X)为以10为底对数的X ; 也就是说,10增加到p次幂(或1后跟p零)的值等于x.对数基本上测量数字的长度,除了它是x的平滑函数:

(注意,在不提供base-10对数函数的语言中,我们总是可以将其计算为log 10(x)= log(x)/ log(10),其中log()是任何对数函数基础.)
例如,我们有
log 10(1)= 0.0
log 10(10)= 1.0
log 10(100)= 2.0
log 10(1000)= 3.0
还有例如:
log 10(5)= 0.69897
log 10(50)= 1.69897
log 10(500)= 2.69897
log 10(5000)= 3.69897
一般而言, Ñ ≤日志10(X)< Ñ 1每当10 Ñ ≤ X <10 Ñ 1.
看看上面的值,应该很容易看到,为了得到一个整数的基数为10的数字,我们应该将其基数为10的对数向下舍入到最接近的整数并加1(因为我们想要10的长度为2,而不是1).
但是,还有一些边缘情况需要考虑:
首先,原来的提问想要的长度- X等于长度X.对数仅针对正数定义,因此我们将x替换为绝对值以使其始终为正数.
其次,原始提问者还希望0到1之间的数字长度为零.但是,对数可以采用任意大的负值:
log 10(0.1)= -1.0
log 10(0.01)= -2.0
log 10(0.001)= -3.0
log 10(0.0001)= -4.0
实际上,log 10(0)= - ∞.为了满足这个要求,我们只需确保我们计算的长度数不能低于0.5,使用最大值和0.5作为log 10()的输入.(我们可以使用介于0.1和1之间的任何数字作为截止值,但0.5恰好是一个很好的圆二进制分数.)
此外,我们必须确保在舍入之前将+1添加到对数,以便我们舍入的数字始终为非负数.那是因为(int)在C#中实际上将负数向上舍入为零.例如,由于log 10(0.5)≈-0.3,表达式(int)Math.Log10(0.5) + 1(加法前的舍入)将评估为0 + 1 = 1而不是预期的0.
((int)Math.Abs(12.324654)).ToString().Length
Run Code Online (Sandbox Code Playgroud)
Math.Abs将转换为正数(不想算负号)
(int)将下降小数点后面数字
ToString()转换为字符串===>“12”
Length告诉你有多少个字符有
有一个边缘情况(int)( some number ) == 0,其中长度会给您1-您可能不想要这个,所以请注意可能性
现在,您可以做的就是将此扩展方法...
public static class Utils
{
public static int Size(this double n)
{
int i = (int)Math.Abs(n);
if ( i == 0 ) return 0;
return i.ToString().Length;
}
}
12.324654.Size() == 2;
Run Code Online (Sandbox Code Playgroud)