数字170可以用以下形式表示为规范化形式:
1.7作为分数系数
指数为+2,以10为底。
170 = 1,7×10 + 2
有没有一种方法可以数学方式提取“分数系数”? 不使用字符串表示形式。
var testInputs =
new double[] {
1.7E+1, // 17
1.7E+2, // 170
1.7E+3, // 1700
-1.7E+1, // -17
-1.7E+2, // -170
-1.7E+3, // -1700
1.7E-1, // 0,17
1.7E-2, // 0,017
1.7E-3, // 0,0017
-1.7E-1, // -0,17
-1.7E-2, // -0,017
-1.7E-3, // -0,0017
};
那些检验的分数系数的绝对值为:1,7。
Nb:,
是小数点分隔符。
答案 0 :(得分:5)
编辑:初始版本不适用于(-1<x<1)
如果我的查询正确无误...
var X = -1.7;
var Y = (decimal)X/(decimal)(Math.Pow(10, (int)Math.Log10(Math.Abs(X))-(X<1 && X > -1?1:0)))
测试:
var inputs = new[] { 1700,170,17,1.7,0.17,0.017,0.0017,
-1700, -170, -17, -1.7, -0.17, -0.017, -0.0017 };
decimal GetFractional(decimal X) =>
(decimal)X/(decimal)(Math.Pow(10, (int)Math.Log10(Math.Abs(X))-(X<1 && X > -1?1:0)));
foreach (var x in inputs)
{
WriteLine($"{x,7}\t\t{GetFractional(x)}");
}
结果:
1700 1,7
170 1,7
17 1,7
1,7 1,7
0,17 1,7
0,017 1,7
0,0017 1,7
-1700 -1,7
-170 -1,7
-17 -1,7
-1,7 -1,7
-0,17 -1,7
-0,017 -1,7
-0,0017 -1,7
答案 1 :(得分:1)
这将是一种解决此问题的算法方法:
public double ExtractFraction(double value)
{
if (value == 0) return value;
if (value > 10 || value < -10)
{
while (value > 10 || value < -10)
{
value /= 10.0;
}
}
else if (value < 1 || value > -1)
{
while (value < 1 && value > -1)
{
value *= 10.0;
}
}
return value;
}
说明:如果该值超出] 10 -10 [的范围,则需要除以10,直到在该范围内滑动
如果该值在] 1 -1范围内,则需要乘以10,直到滑出该范围