diff --git a/ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs b/ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs index e4527dff7..49d2db93a 100644 --- a/ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs @@ -949,30 +949,24 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax ICompilation compilation = type.GetDefinition().Compilation; Expression expr = null; + string str; if (isDouble) { if (Math.Floor((double)constantValue) == (double)constantValue) { expr = new PrimitiveExpression(constantValue); } + + str = ((double)constantValue).ToString("r"); } else { if (Math.Floor((float)constantValue) == (float)constantValue) { expr = new PrimitiveExpression(constantValue); } - } - if (expr == null) { - (long num, long den) = isDouble - ? FractionApprox((double)constantValue, MAX_DENOMINATOR) - : FractionApprox((float)constantValue, MAX_DENOMINATOR); - - if (IsValidFraction(num, den) && IsEqual(num, den, constantValue, isDouble) && Math.Abs(num) != 1 && Math.Abs(den) != 1) { - var left = MakeConstant(type, num); - var right = MakeConstant(type, den); - return new BinaryOperatorExpression(left, BinaryOperatorType.Divide, right).WithoutILInstruction() - .WithRR(new ConstantResolveResult(type, constantValue)); - } + str = ((float)constantValue).ToString("r"); } - if (expr == null && UseSpecialConstants) { + bool useFraction = (str.Length - (str.StartsWith("-", StringComparison.OrdinalIgnoreCase) ? 2 : 1) > 5); + + if (useFraction && expr == null && UseSpecialConstants) { IType mathType; if (isDouble) mathType = compilation.FindType(typeof(Math)); @@ -984,6 +978,19 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax ?? TryExtractExpression(mathType, type, constantValue, "E", isDouble); } + if (useFraction && expr == null) { + (long num, long den) = isDouble + ? FractionApprox((double)constantValue, MAX_DENOMINATOR) + : FractionApprox((float)constantValue, MAX_DENOMINATOR); + + if (IsValidFraction(num, den) && IsEqual(num, den, constantValue, isDouble) && Math.Abs(num) != 1 && Math.Abs(den) != 1) { + var left = MakeConstant(type, num); + var right = MakeConstant(type, den); + return new BinaryOperatorExpression(left, BinaryOperatorType.Divide, right).WithoutILInstruction() + .WithRR(new ConstantResolveResult(type, constantValue)); + } + } + if (expr == null) expr = new PrimitiveExpression(constantValue);