我有一个静态方法,它接受一个字符串作为输入,如果该字符串代表一个数字,则返回原始输入字符串。如果字符串不代表数字,则处理输入字符串并返回转换后的字符串。我在写测试用例。我正在尝试验证包含 double.MinValue
或 double.MaxValue
的输入字符串是否原样返回。我已经阅读了许多论坛,包括 StackOverflow,并提出了以下逻辑:
string doubleMax = double.MaxValue.ToString();
double d;
CultureInfo cultureInfo = new CultureInfo("en-US", true);
if (Double.TryParse(doubleMax, NumberStyles.Any, cultureInfo.NumberFormat, out d))
{
Console.WriteLine("parsed");
}
else
{
Console.WriteLine("couldn't parse");
}
问题是 Double.TryParse()
总是返回 false。我以多种不同的方式调用了 TryParse()
,但结果始终相同,都是错误的。
如果我使用 decimal.MinValue()
、int.MinValue()
或 float.MinValue()
,此逻辑有效。
有人能告诉我为什么我的逻辑不适用于 double.MinValue
吗?
最佳答案
这是因为 float 的存储和显示方式。当值变成人类可读的字符串时,该值会四舍五入,对于 double.MaxValue
它恰好被四舍五入,因此它不再适合 double
.
您可以使用往返格式“R”将值转换为始终可以解析回相同值的字符串,因为它会增加额外的精度,直到返回正确的值。此外,在格式化数字时使用相同的文化来解析它,以避免文化差异:
CultureInfo cultureInfo = new CultureInfo("en-US", true);
string doubleMax = Double.MaxValue.ToString("R", cultureInfo);
Console.WriteLine(doubleMax);
double d;
if (Double.TryParse(doubleMax, NumberStyles.Any, cultureInfo.NumberFormat, out d)) {
if (d == Double.MaxValue) {
Console.WriteLine("parsed");
} else {
Console.WriteLine("value changed");
}
} else {
Console.WriteLine("couldn't parse");
}
输出:
1.7976931348623157E+308
parsed
编辑:
我添加了字符串的输出,并验证解析后的值实际上仍然是 MaxValue。
关于c# - 为什么 Double.TryParse() 对于包含 double.MaxValue 或 double.MinValue 的字符串返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4441782/