在我的程序中,我遇到了将一个小数字写入context.Response的问题,然后由jQuery ajax响应读取。
value = -0.00000015928321772662457;
context.Response.Write(value.ToString("#.#"));
返回[object XMLDocument]
然而,
context.Response.Write(value.ToString("n"));
按预期返回0.00。
使用“n”对于我的程序来说非常好,但为什么“#。#”会返回XMLDocument?
答案 0 :(得分:4)
它显示一个类型名称可能是因为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")
会返回一个空字符串(""
),因为没有非零数字来填充格式模板(这比返回{更好} {1}})。
"."
调用Write(string)
的{{1}}方法,将其传递给TextWriter
,当然不会写任何内容。
响应总是向客户端生成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而不是预期的数字。