110,533
社区成员
发帖
与我相关
我的任务
分享
private static string DivideWithValidDigits(BigInteger d1, BigInteger d2, int n)
{
var log10 = Math.Floor(Math.Log10((double)(d1 / d2)));
var result = new StringBuilder(n);
var zeros = 0;
while (result.Length - zeros <= n)
{
var mod = d1 % d2;
if (result.Length - zeros >= n)
{
if ((d1 - mod) / d2 > 4)
{
var j = result.Length - 1;
while (j >= 0)
if (result[j] == '9')
{
result[j] = '0';
j--;
}
else
{
result[j]++;
break;
}
if (j < 0)
{
result.Insert(0, '1');
log10++;
}
}
break;
}
if (mod != 0)
{
result.Append((d1 - mod) / d2);
while (zeros < result.Length && result[zeros] == '0') zeros++;
d1 = mod * 10;
}
else
{
result.Append(d1 / d2);
while (zeros < result.Length && result[zeros] == '0') zeros++;
break;
}
}
var pos = (log10 < 0 ? 0 : Convert.ToInt32(log10)) + 1;
if (pos < result.Length) result.Insert(pos, '.');
return result.ToString();
}
}
private static string DivideWithValidDigits(BigInteger molecular, BigInteger denominator, int validDigits)
{
var log10 = Math.Floor(BigInteger.Log10(molecular) - BigInteger.Log10(denominator));
var result = new StringBuilder(validDigits);
var zeros = 0;
while (result.Length - zeros < validDigits) // process digits
{
var mod = molecular % denominator;
if (mod != 0)
{
result.Append((molecular - mod) / denominator);
while (zeros < result.Length && result[zeros] == '0') zeros++;
molecular = mod * 10;
}
else
{
result.Append(molecular / denominator);
break;
}
}
if (result.Length - zeros >= validDigits) // process rounding
{
if ((molecular - molecular % denominator) / denominator >= 5)
{
var j = result.Length - 1;
while (j >= 0)
if (result[j] == '9')
{
result[j] = '0';
j--;
}
else
{
result[j]++;
break;
}
if (j < 0)
{
result.Insert(0, '1');
log10++;
}
}
}
var pos = (log10 < 0 ? 0 : Convert.ToInt32(log10)) + 1;
if (pos < result.Length) result.Insert(pos, '.');
return result.ToString();
}
private static string DivideWithValidDigits(BigInteger d1, BigInteger d2, int n)
{
var log10 = Math.Floor(BigInteger.Log10(d1 / d2));
var result = new StringBuilder(n);
var zeros = 0;
while (result.Length - zeros <= n)
{
var mod = d1 % d2;
if (result.Length - zeros >= n)
{
if ((d1 - mod) / d2 > 4)
{
var j = result.Length - 1;
while (j >= 0)
if (result[j] == '9')
{
result[j] = '0';
j--;
}
else
{
result[j]++;
break;
}
if (j < 0)
{
result.Insert(0, '1');
log10++;
}
}
break;
}
if (mod != 0)
{
result.Append((d1 - mod) / d2);
while (zeros < result.Length && result[zeros] == '0') zeros++;
d1 = mod * 10;
}
else
{
result.Append(d1 / d2);
//while (zeros < result.Length && result[zeros] == '0') zeros++; // zeros will be no more used
break;
}
}
var pos = (log10 < 0 ? 0 : Convert.ToInt32(log10)) + 1;
if (pos < result.Length) result.Insert(pos, '.');
return result.ToString();
}