c# - 为什么 Double.TryParse() 对于包含 double.MaxValue 或 double.MinValue 的字符串返回 false?

标签 c#

我有一个静态方法,它接受一个字符串作为输入,如果该字符串代表一个数字,则返回原始输入字符串。如果字符串不代表数字,则处理输入字符串并返回转换后的字符串。我在写测试用例。我正在尝试验证包含 double.MinValuedouble.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/

相关文章:

c# - Ascii 范围考虑二进制文件?

C# XmlElement : SelectSingleNode returns null for empty string?

c# - asp.net core 中的常规默认路由不起作用

c# - 在 Visual Studio 2012 中使用 newton.jsoft (json.net) 将 c# 翻译为 vb .net 时出现翻译错误

c# - 在 Visual Studio 2012 中运行单元测试的问题

c# - 动态创建的 TextBox 没有焦点,MinimumSize 和 Font 已更改

C# .Net 在分离线程和应用程序退出中接收 UDp 数据包

c# - Windows 进程的退出代码错误(C#/C++/等)?

c# - VB.NET 的方法体内不允许代码区域?

c# - 记录器包装器最佳实践