为什么#.#不适用于非常小的数字
本文关键字:数字 适用于 不适用 为什么 非常 | 更新日期: 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的"局部变量"面板中看到类似的行为:
-
启动一个新的控制台应用程序项目并替换
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; } }
-
在
Main()
的右大括号 (}
( 处设置断点并运行项目。 -
现在查看"局部变量"面板。Visual Studio 尝试对对象调用
ToString()
,以获取在此面板的"值"列中的大括号之间显示的内容。但是,由于一个实例返回null
,显然存在获取类型名称的回退:a {asdf} b {} c {ConsoleApplication1.Program}
我想context.Response.Write()
也在做类似的事情。在内部,它使用TextWriter
,以下是"#.#"
问题中发生的一些过程:
-
value.ToString("#.#")
,不像value.ToString("#.0")
,返回一个空字符串(""
(,因为没有非零数字来填充格式模板(这比返回"."
更好(。 -
TextWriter
的Write(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,而不是预期的数字。