具有最大字符的System.Double值

use*_*926 4 c# xml serialization .net-4.0 datacontractserializer

我正在测试double[]数组的网络xml序列化,所以我很想知道什么是具有大多数字符的双重值,它是序列化的,所以我可以测试序列化数组的最大输出大小.

xan*_*tos 6

它应该是24.

double.MinValue.ToString("R").Length
Run Code Online (Sandbox Code Playgroud)

来自double.ToString(string)

或者"R",如果数字可以用该精度表示,则返回15位数;如果数字只能用最大精度表示,则返回17位数.

你必须有在最大17位,再加上1招牌,再加上1小数点分隔符,再加上5为E + XXX(double.MaxValue1.7976931348623157E+308double.Epsilon,最小值> 04.94065645841247E-324,所以无论是在形式E[+-][0-9]{1,3}).

请注意,在技术上,在某些奇怪的语言中,

var str2 = double.PositiveInfinity.ToString("R");
Run Code Online (Sandbox Code Playgroud)

可能会更长(因为字符串是本地化的),但我希望你能用你的数字序列化CultureInfo.InvariantCulture!

但请记住,用户可以从控制面板改变他们的文化...类似于:

var culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
culture.NumberFormat.NegativeSign = "Negative";
culture.NumberFormat.NumberDecimalSeparator = "DecimalSeparator";
var str4 = double.MinValue.ToString("R", culture);
Run Code Online (Sandbox Code Playgroud)

结果: Negative1DecimalSeparator7976931348623157E+308

出于这个原因,最好使用CultureInfo.InvariantCulture:-)

但是如果你想知道真相,在控制面板中小数点分隔符可以长达3个字符,负数表示最多4个(你可以尝试一下,或者你可以检查LOCALE_SDECIMALLOCALE_SNEGATIVESIGN,显然是终止null字符可以在.NET中忽略)