C 语言中的指数#

Exponents in C#

提问人:Madhu 提问时间:4/19/2018 最后编辑:Pac0Madhu 更新时间:6/6/2018 访问量:931

问:

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

Math.Round()还保留指数值。应该用函数代替函数将其转换为非指数值吗?请解释。zscore.ToString("F14")Math.Round()

C# 点浮 点精度

评论

3赞 PaulF 4/19/2018
指数不是值存储方式的一部分,而是将值转换为字符串的方式。第一次计算后,尝试以下两行代码:Console.WriteLine(zscore);Console.WriteLine(“{0:F14}”, zscore);第一个将打印指数,第二个不打印 - zscore 的值没有更改。
1赞 Jeroen Mostert 4/19/2018
顺便说一句,使用这些指数是有充分理由的:值确实可以变得非常小。如果你总是用恒定数量的数字来格式化它们,但不使用指数,那么你的值很容易在一大堆前导零中完全丢失。这很少是可取的。double

答:

7赞 Pac0 4/19/2018 #1

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

Math.Round实际上将返回一个新值,四舍五入到指定的小数点(至少是 ar,尽可能接近浮点数)。

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

它是否以指数表示法显示的事实与 无关。Round


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

它只是强制将数字显示为完整的小数,没有指数表示法,并指定位数。所以这似乎是你真正想要的。


例子:

(可在线执行: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"));

将输出:

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