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

本文关键字:数字 适用于 不适用 为什么 非常 | 更新日期: 2023-09-27 18:02:14

在我的程序中,我在将少量数字写入上下文时遇到了问题。然后由 jQuery ajax 响应读取的响应。

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

返回[object XMLDocument]

然而

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

按预期返回 0.00。

使用"n"对我的程序来说是完全可以的,但是为什么"#.#"返回XMLDocument?

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

它显示一个类型名称可能是因为某些东西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}
    

我想context.Response.Write()也在做类似的事情。在内部,它使用TextWriter,以下是"#.#"问题中发生的一些过程:

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

  2. TextWriterWrite(string)方法调用ToCharArray(),将其传递给Write(char[]),当然什么也不写。

响应总是生成客户端的XMLDocument,因为 XML 是 AJAX 传输请求和响应的方式 - 即使是正确的"0.00"也会在 XML 中传输。在它和你的jQuery收到响应之间的某个地方,有些东西决定在处理时应该替换一个空XMLDocument。甚至可能是jQuery本身在这样做,但我不知道 ASP.NET 管道或jQuery足以找到位置。

所以很明显,空的 AJAX 响应不是那么好。

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

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