解决方案 »
- C#调用C++动态链接库(十万火急)送高分
- JS截断后台存储过程
- 如何控制我的程序在系统中当前只能存在一个进程
- 如何向文件中写入ASCII值
- 我想用C#读取、操作Word、Excel文件,是不是必须先安装Office呀?这是必须的吗?还请过来人给指导一下
- 推荐
- 请问如何在Property内部取得标记它的CustomerAttribute?
- ★200高分求一winform下的QQ菜单。
- 小问题,请问用C#生成“hello,word”的路径是怎么样的,我刚刚开始学习,请各位高手多多指点
- 求助,关于datagirdview数据绑定arraylist
- C# 怎么生成a-z的随机数
- WIN7 64位sql+vs2008连接问题
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();
}
}
写了一个,大家看看能不能改进……
我感觉你这里强制类型转换可能会出错,会导致数据溢出。而且两个BigInteger相除,返回的结果还是BitInteger,就算强制转换也应该转化为Int32啊,怎么都不会是double类型。
{
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();
}
{
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();
}