C#四舍五入负指数双倍值
我尝试了所有方法,但无法将一个非常长的十进制值(指数)的负双精度值四舍五入到小数点后6位C#四舍五入负指数双倍值,c#,math,double,rounding,exponential,C#,Math,Double,Rounding,Exponential,我尝试了所有方法,但无法将一个非常长的十进制值(指数)的负双精度值四舍五入到小数点后6位 string str = "-1.7976931348623157E+308"; double d = double.Parse(str); d = Math.Round(d, 6, MidpointRounding.AwayFromZero); string str2 = d.ToString(); 我想得到-1.797693,就这么简单 请注意,正如小表格所示,1.xxE+308不可能变成1.xx。但
string str = "-1.7976931348623157E+308";
double d = double.Parse(str);
d = Math.Round(d, 6, MidpointRounding.AwayFromZero);
string str2 = d.ToString();
我想得到-1.797693,就这么简单 请注意,正如小表格所示,
1.xxE+308
不可能变成1.xx
。但假设你不是那个意思,你只是想构建你的输出:
string str2 = d.ToString("E6");
其中,E6
中的数字是希望在E表示法之前显示的数字量
对于上面的示例,str2
的值为“-1.797693E+308”
如果您确实需要对值进行四舍五入(我不确定您为什么会这样做-为什么要放弃精度?它不会妨碍您),您应该让您的
调用保持原样。您可以根据以下数量对我编写的代码进行四舍五入:
//
///使用科学指数和指定的重要数字格式化数字。
///
///要格式化的值
///要显示的符号数字的数目
///一根粗线
公共静态字符串Sci(此双x,整数有效位)
{
//检查特殊号码和非特殊号码
if(double.isnfinity(x)| | double.IsNaN(x)| | x==0)
{
返回x.ToString();
}
//提取符号以便我们只处理正数
int符号=数学符号(x);
x=Math.Abs(x);
//获取科学指数,10^3,10^6。。。
intsci=(int)数学层(数学日志(x,10)/3)*3;
//找到指数的标度数
x=x*数学功率(10,-sci);
//查找小数点左边的位数
intdg=(int)数学层(数学日志(x,10))+1;
//调整小数以显示
整数小数=数学最小值(有效数字-dg,15);
//小数的格式
字符串fmt=新字符串('0',小数);
如果(sci==0)
{
//无指数
返回string.Format(“{0}{1:0.”+fmt+“}”,
你知道,“-1.7976931348623157E+308”
是-1.797693
,前面有307个零,对吗?你怎么能期望舍入到-1.797693?C有一个十进制值,你应该使用它。如果你只想格式化为输出,你可以使用d.ToString(“#.#.#”;@LittleBobbyTables-是的,我理解。让我简单地回答这个问题-我的要求是值应该显示为-1.797693。谢谢你的回答。@JoeSwindell-那将显示“-179769313486232000000…”308个零。谢谢你的回答。谢谢。但是正如我上面提到的…我的要求是值应该显示为-1.797693“-1.797693”。最好的方法是什么?@user2502938没有任何意义-没有真正的方法这样做,因为没有逻辑将指数从科学符号值中剥离。什么是”-1.797693"对于一个有308个额外零的数字,你的意思是什么?你到底想做什么?请注意,显然他不想要179.7693e306
,但是179.7693
,没有指数。不知道为什么,但也许你口袋里也有一些东西。@ja72-谢谢分享代码。是的,正如弗克尔在我的网站上提到的那样但我不明白为什么每个人都质疑这个要求?如果要求说我们需要它,我们就需要它…对吗?我们知道我们会失去所有小数点的细节,但这就是我们想要的。
/// <summary>
/// Format a number with scientific exponents and specified sigificant digits.
/// </summary>
/// <param name="x">The value to format</param>
/// <param name="significant_digits">The number of siginicant digits to show</param>
/// <returns>The fomratted string</returns>
public static string Sci(this double x, int significant_digits)
{
//Check for special numbers and non-numbers
if (double.IsInfinity(x)||double.IsNaN(x)||x==0)
{
return x.ToString();
}
// extract sign so we deal with positive numbers only
int sign=Math.Sign(x);
x=Math.Abs(x);
// get scientific exponent, 10^3, 10^6, ...
int sci=(int)Math.Floor(Math.Log(x, 10)/3)*3;
// scale number to exponent found
x=x*Math.Pow(10, -sci);
// find number of digits to the left of the decimal
int dg=(int)Math.Floor(Math.Log(x, 10))+1;
// adjust decimals to display
int decimals=Math.Min(significant_digits-dg, 15);
// format for the decimals
string fmt=new string('0', decimals);
if (sci==0)
{
//no exponent
return string.Format("{0}{1:0."+fmt+"}",
sign<0?"-":string.Empty,
Math.Round(x, decimals));
}
int index=sci/3+6;
// with 10^exp format
return string.Format("{0}{1:0."+fmt+"}e{2}",
sign<0?"-":string.Empty,
Math.Round(x, decimals),
sci);
}