为什么不#。#适用于非常小的数字?

时间:2011-07-15 02:20:46

标签: c#

在我的程序中,我遇到了将一个小数字写入context.Response的问题,然后由jQuery ajax响应读取。

value = -0.00000015928321772662457;
context.Response.Write(value.ToString("#.#"));

返回[object XMLDocument]

然而,

context.Response.Write(value.ToString("n"));

按预期返回0.00。

使用“n”对于我的程序来说非常好,但为什么“#。#”会返回XMLDocument?

2 个答案:

答案 0 :(得分:4)

它显示一个类型名称可能是因为ToString()某些内容返回null,所以它必须显示其他内容。您在Visual Studio的“本地”面板中看到类似的行为:

  1. 启动新的控制台应用程序项目并替换Program类:

      class Program {
           static void Main() {
                var a = new Program( "asdf" );
                var b = new Program( "" );
                var c = new Program( null );
           } // <-- breakpoint here
    
           string _data;
           public Program( string data ) {
                _data = data;
           }
    
           public override string ToString() {
                return _data;
           }
      }
    
  2. }的右大括号(Main())处设置断点并运行项目。

  3. 现在查看“本地”面板。 Visual Studio尝试在对象上调用ToString(),以便在此面板的“值”列中的大括号之间显示内容。但是,因为一个实例返回null,显然会获得类型名称的后备:

    a      {asdf}
    b      {}
    c      {ConsoleApplication1.Program}
    
  4. 我认为context.Response.Write()正在做类似的事情。在内部使用TextWriter,这是"#.#"问题中发生的一些过程:

      value.ToString("#.#")不同,
    1. value.ToString("#.0")会返回一个空字符串(""),因为没有非零数字来填充格式模板(这比返回{更好} {1}})。

    2. "."调用Write(string)的{​​{1}}方法,将其传递给TextWriter,当然不会写任何内容。

    3. 响应总是向客户端生成ToCharArray(),因为XML是AJAX传输请求和响应的方式 - 即使正确的Write(char[])也是以XML格式传输的。在它和你的jQuery响应之间的某个地方,在处理时应该替换一个空的XMLDocument。甚至可能是jQuery本身也这样做,但我不知道ASP.NET管道或jQuery足以找到哪里。

      显然,空的AJAX响应并不是那么好。

答案 1 :(得分:0)

http://msdn.microsoft.com/en-us/library/kfsatb94.aspx

  

默认情况下,返回值仅包含15位精度,但内部最多保留17位数。如果此实例的值大于15位,ToString将返回PositiveInfinitySymbol或NegativeInfinitySymbol而不是预期的数字。