double.MaxValue to string未转换回来

时间:2016-11-12 11:06:54

标签: c# .net

我只是提问。 此测试如何失败?在注释中是变量值

[Fact]
public void ToNullableDouble_CorrectInput_ReturnsCorrectValue()
{
    double expectedValue = double.MaxValue; //1.7976931348623157E+308
    string expectedValueString = expectedValue.ToString(); //"1,79769313486232E+308" - fail, I do not know why
    string expectedValueString2 = expectedValue.ToString(CultureInfo.InvariantCulture); //"1.79769313486232E+308" - fail
    string expectedValueString3 = 1.75.ToString(); //"1,75" - pass
    string expectedValueString4 = 1.75.ToString(CultureInfo.InvariantCulture); //"1.75" - fail because of the culture

    double number;
    double? convertedValue = double.TryParse(expectedValueString, out number) ? number : (double?)null;
    //convertedValue = null, number = 0

    Assert.True(convertedValue.HasValue);
}

Float表现非常相似,十进制就可以了。我知道十进制类型之间有什么区别。但我不明白MaxValue怎么可以不变。它不应该是文化背景:

double.TryParse(expectedValueString, out number) ? number : (double?)null;
null
double.TryParse(expectedValueString2, out number) ? number : (double?)null;
null
double.TryParse(expectedValueString3, out number) ? number : (double?)null;
1.75
double.TryParse(expectedValueString4, out number) ? number : (double?)null;
null

其他值正常工作,例如:1.75

1 个答案:

答案 0 :(得分:1)

问题可能是由于double.MaxValue被转换为字符串这一事实。字符串输出不包含所有数字,而是舍入。解析这个值会溢出双倍。

解决方案1:

string stringDouble = double.MaxValue.ToString();
double doubleValue;
if (!double.TryParse(stringDouble, out doubleValue)) 
{
    doubleValue = stringDouble.Equals(double.MaxValue) ? double.MaxValue : double.MinValue;
}

The Round-trip ("R") Format Specifier

解决方案2:

PolyUtil