当小数点前的数字也是零时,我需要一种方法来获取小数点后的零数。因此,例如0.00000000987654将计算为8,因为0后面有8个零。将小数数据类型转换为字符串,然后可以用科学计数法将其显示为9.87654E9。
我需要这样做的原因是,我可以多次迭代非常小的数字,从而产生对计算器来说太高的结果。
因此,例如0.123456789乘以0.1并迭代1000次。 (0.123456789 * 0.1 * 0.1 * 0.1 * 0.1 ......)使用全28位精度的十进制数据类型在1.234567890000000000000000000E-1001处得出并以科学计数法显示
与阶乘合作时,我能够实现这一目标。例如1000的阶乘为1000 x 999 * 998 * 997 * 996 ....一直下降到0。这个数字对于计算器来说太高了,所以我使用迭代法将结果以科学计数法达到28位精度
对于很多人来说,我是成功的。我通过获取此期间之前的位数来实现这一点:
static int Get_Digits_Before_Period(decimal Large_Number)
{
decimal d = decimal.Floor(Large_Number < 0 ? decimal.Negate(Large_Number) : Large_Number);
// 0.xyz should return 0, therefore a special case
if (d == 0m)
return 0;
int cnt = 1;
while ((d = decimal.Floor(d / 10m)) != 0m)
cnt++;
return cnt;
}
我现在需要一种类似的方法,但是需要一种方法来获取周期后的零数。
答案 0 :(得分:1)
十进制的指数范围是0〜-28,因此它不能表示数字,例如1.234567890000000000000000000E-1001,所以我只解释有效范围内的数字。
要计算小数点的零,您可以先获取小数的整数和指数部分
var number = 0.00000000987654m;
var bits = decimal.GetBits(number); //0~2 are integer part.
var exponent = (bits[3] & 0xff0000) >> 16;
然后将指数减少整数的有效位数,以使句点后的计数为零。
var zeros = exponent;
for(int i = 0; i <= 2; i++)
{
if(bits[i] != 0)
zeros -= (int)Math.Log10(bits[i]) + 1;
}
if(zeros < 0)
zeros = 0;