C#中的指数

Mad*_*dhu 3 c# floating-point floating-accuracy

int trail = 14;
double mean = 14.00000587000000;
double sd = 4.47307944700000;

double zscore = double.MinValue;

zscore = (trail - mean) / sd; //zscore at this point is exponent value -1.3122950464645662E-06

zscore = Math.Round(zscore, 14); //-1.31229505E-06
Run Code Online (Sandbox Code Playgroud)

Math.Round()也保持指数值.应该zscore.ToString("F14")使用而不是Math.Round()函数将其转换为非指数值?请解释.

Pac*_*ac0 7

这些都是完全独立的问题.

Math.Round实际上将返回一个新值,四舍五入到指定的十进制数(至少是ar,就像浮点数一样).

您可以在任何地方重复使用此结果值,并在需要时以16位小数精度显示它,但它不应与原始值相同.

它以指数表示法显示的事实与其无关Round.


使用ToString("F14")数字时,这只是一个显示规范,不会以任何方式修改基础值.基础值可能是否则将会或不会显示为指数表示法的数字,并且可能或可能实际上具有14位有效数字.

它只是强制数字显示为完整小数而不带指数表示法,并指定数字位数.所以它似乎是你真正想要的.


例子 :

(在线可执行文件:http://rextester.com/PZXDES55622)

double num = 0.00000123456789;

Console.WriteLine("original :");
Console.WriteLine(num.ToString());
Console.WriteLine(num.ToString("F6"));
Console.WriteLine(num.ToString("F10"));
Console.WriteLine(num.ToString("F14"));

Console.WriteLine("rounded to 6");
double rounded6 = Math.Round(num, 6);
Console.WriteLine(rounded6.ToString());
Console.WriteLine(rounded6.ToString("F6"));
Console.WriteLine(rounded6.ToString("F10"));
Console.WriteLine(rounded6.ToString("F14"));

Console.WriteLine("rounded to 10");
double rounded10 = Math.Round(num, 10);
Console.WriteLine(rounded10.ToString());
Console.WriteLine(rounded10.ToString("F6"));
Console.WriteLine(rounded10.ToString("F10"));
Console.WriteLine(rounded10.ToString("F14"));
Run Code Online (Sandbox Code Playgroud)

将输出:

original :
1,23456789E-06
0,000001
0,0000012346
0,00000123456789
rounded to 6
1E-06
0,000001
0,0000010000
0,00000100000000
rounded to 10
1,2346E-06
0,000001
0,0000012346
0,00000123460000
Run Code Online (Sandbox Code Playgroud)