翻倍.MaxValue到string的值不能转换回
本文关键字:不能 转换 MaxValue string 翻倍 | 更新日期: 2023-09-27 18:17:46
我有一个问题。这个测试怎么会失败?注释中是变量
的值[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
这个问题很可能是由于双重的事实。MaxValue被转换为字符串。字符串输出不包含所有数字,而是四舍五入。解析该值会溢出双精度类型。
解决方案1:
string stringDouble = double.MaxValue.ToString("r");
double doubleValue = double.Parse(stringDouble); // No exception
往返("R")格式说明符
解决方案2:
string stringDouble = double.MaxValue.ToString();
double doubleValue;
if (!double.TryParse(stringDouble, out doubleValue))
{
doubleValue = stringDouble.Equals(double.MaxValue) ? double.MaxValue : double.MinValue;
}