一朋友寫了一個把輸入的整型或浮點數轉換為科學計數法表示的算法,寫好後叫我去幫他看看有沒有什麼bug之類的沒有考慮周全。我還沒有細看就已經把我嚇到了----整整寫了將近三百行代碼。我也沒說他什麼,只是回到我的電腦前自己寫了一個試試。
需求:輸入一個數,用科學計數法表示,要有三位有效數字,冪數部分也要求是三位,不足則補零
代碼如下:
public abstract class ScienceCount
{
public static string KXJSF(double num)
{
double bef =System.Math.Abs(num);
int aft=0;
while (bef >= 10 ||(bef < 1&& bef!=0))
{
if (bef >= 10)
{
bef = bef / 10;
aft++;
}
else
{
bef = bef * 10;
aft--;
}
}
return string.Concat(num>=0?"":"-",ReturnBef(bef),"E",ReturnAft(aft));
}
/// <summary>
/// 有效數字的處理
/// </summary>
/// <param name="bef">有效數字</param>
/// <returns>三位有效數字,不足則補零</returns>
public static string ReturnBef(double bef)
{
if (bef.ToString() != null)
{
char[] arr = bef.ToString().ToCharArray();
switch (arr.Length)
{
case 1:
case 2: return string.Concat(arr[0] , "." , "00"); break;
case 3: return string.Concat(arr[0] + "." + arr[2] + "0"); break;
default: return string.Concat(arr[0] + "." + arr[2] + arr[3]); break;
}
}
else
return "000";
}
/// <summary>
/// 冪的處理
/// </summary>
/// <param name="aft">冪數</param>
/// <returns>三位冪數部分,不足則補零</returns>
public static string ReturnAft(int aft)
{
if (aft.ToString() != null)
{
string end;
char[] arr = System.Math.Abs(aft).ToString().ToCharArray();
switch (arr.Length)
{
case 1: end = "00" + arr[0]; break;
case 2: end = "0" + arr[0] + arr[1]; break;
default: end = System.Math.Abs(aft).ToString(); break;
}
return string.Concat(aft >= 0 ? "+" : "-" , end);
}
else
return "+000";
}
}
調用代碼:
static void Main()
{
string num = "0";
while (num != "#")
{
num = Console.ReadLine();
if(!string.IsNullOrEmpty(num.Trim()))
Console.WriteLine(ScienceCount.KXJSF(double.Parse(num)));
}
}