将“1.79769313486232E+308”转换为double而不会出现OverflowException?我有这个字符串“1.79769313486232E+308”,我试图将它转换为.NET数值(双精度?),但出现以下异常。我正在使用Convert.ToDouble()。进行此转换的正确方法是什么?OverflowException:ValuetoolargeortoosmallforDouble问题可能是由于Double.MaxValue转为字符串,输出字符串时,不是所有数字都输出,而是四舍五入。解析这个值会溢出两倍。使用Double.TryParse然后在失败的情况下检查字符串“1.79769313486232E+308”是否相等,如果您需要保持字符串方式,则替换Double.MaxValue应该是一个快速修复。编辑:当然,如果您不需要以这种方式保留字符串,请使用RoundTrip格式说明符首先生成字符串,如乔恩在他的回答中所述。不幸的是,这个值大于double.MaxValue,因此异常。正如codekaizen所建议的那样,您可以对字符串的测试进行硬编码。如果您是第一个生成字符串的人,更好的(IMO)替代方法是使用“r”格式说明符。然后您生成的字符串将是“1.7976931348623157E+308”,然后将被正确解析:strings=double.MaxValue.ToString("r");双d=double.Parse(s);//没有例外显然,如果您无法控制数据,那也无济于事-但您应该明白,在这种情况下您可能会丢失它。您可以尝试使用double.Parse()或double.TryParse()而不是Convert.ToDouble(),但我不确定您会得到更好的结果。顺便说一句,您提供的字符串等于double.MaxValue,这是(当然)可以包含在double中的最大值,所以这很可能是您发生错误的地方。浮点数类型很挑剔,所以我假设正在进行某种舍入并将其推出类型的范围。您也可以尝试decimal数据类型。你可能会有更好的运气。这就是我想出的。感谢JonSkeet和codekaizen。privatedoubleconvertToDouble(stringstr){doubledbl;如果(double.TryParse(str,outdbl))返回dbl;如果(str=="1.79769313486232E+308")返回double.MaxValue;返回double.MinValue;}Demo问题及解决方案:vars=double.MaxValue.ToString();双d;如果(!double.TryParse(s,outd)){d=s.Equals(double.MaxValue)?double.MaxValue:双倍。最小值;这是一个更通用的实现,代表不同的格式和文化并且更宽容:#regionMatchDoubleMinMaxValuesRegex//////这个正则表达式匹配代表a或a的字符串。///如果是a那么组“isNegative”将被匹配为.///privatestaticreadonlyRegexMatchDoubleMinMaxValuesRegex=newRegex(@"^(?>(?-)|+?)1(?>[,.]?)79769313486232(?>[eE]+308|0{294}(?>[,.]|$))",RegexOptions.Compiled|RegexOptions.IgnorePatternWhitespace);#endregion//////将指定区域性特定格式的数字字符串表示形式转换为其等效的双精度浮点数。///这个实现与本地double.Parse实现相比,tation更容忍:///stringsrepresentingandcanbeparsedwithout.//////包含要转换的数字的字符串。///对于某些类型转换,用于解析值的可选文化信息。///如果未指定,则将使用当前文化。///对于某些类型转换,可选的数字样式配置将用于解析值。///如果未指定,则将使用默认值。///一个双精度浮点数,相当于.///一片空白。///不代表有效格式的数字。///表示小于或大于的数字。publicstaticdoubleParseDoubleEx(strings,CultureInfocultureInfo=null,NumberStyles?numberStyles=null){//尝试解析doubletempValue;boolparseSuccess=(numberStyles!=null)?double.TryParse(s,numberStyles.Value,cultureInfo,outtempValue):double.TryParse(s,NumberStyles.Any,cultureInfo,outtempValue);//如果解析失败,检查最小值或最大值(按模式)if(parseSuccess==false){Matchmatch=MatchDoubleMinMaxValuesRegex.Match(s);如果(match.Success==true)tempValue=(match.Groups["isNegative"].Success==false)?double.MaxValue:double.MinValue;elsethrownewOverflowException("一个双精度浮点数,等于s中指定的数值或符号。");}返回临时值;}异常表示数字对于双精度数来说太大了,你必须找到一个大型库来为你处理它,因为我知道.Net中没有任何库可以处理非常大的数字。以上就是C#学习教程:如果没有OverflowException,将"1.79769313486232E+308"转为double?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
