2016-11-12 4 views
-1

私は単に質問しています。 このテストはどのように失敗しますか?コメントでは、変数の値ですdouble.MaxValue to stringは変換されていませんback

[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); 
} 

フロートは、小数点以下はokです、かなり同じように動作します。私は小数点以下の型の違いを知っています。しかし、どのようにして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 

が正しく動作例えば問題が原因double.MaxValueが文字列に変換されたという事実のために可能性がある。:1.75

+0

何を失敗していますか? – mybirthname

+0

convertedValueはnullであり、doubleでなければなりません.MaxValue – Marv

+0

以下の理由を説明します。 – mybirthname

答えて

1

:それはカルチャ設定する必要がありますされていません。文字列出力にすべての数字が含まれているのではなく、丸められています。この値を解析すると、ダブルがオーバーフローします。

解決方法1:

string stringDouble = double.MaxValue.ToString("r"); 
double doubleValue = double.Parse(stringDouble); // No exception 

The Round-trip ("R") Format Specifier

解決方法2:

string stringDouble = double.MaxValue.ToString(); 
double doubleValue; 
if (!double.TryParse(stringDouble, out doubleValue)) 
{ 
    doubleValue = stringDouble.Equals(double.MaxValue) ? double.MaxValue : double.MinValue; 
} 
関連する問題