【问题标题】:Convert numbers with exponential notation from string to double or decimal将具有指数符号的数字从字符串转换为双精度或十进制
【发布时间】:2011-12-14 05:44:28
【问题描述】:

有没有一种快速的方法可以将指数表示法的数字(例如:“0.5e10”或“-5e20”)转换为十进制或双精度数?

更新:我找到了Parse a Number from Exponential Notation,但除非我指定了文化,否则这些示例对我不起作用。

解决方案:

double test = double.Parse("1.50E-15", CultureInfo.InvariantCulture);

【问题讨论】:

  • @Ramhound:出于多种原因,这并不理想;更不用说使用昂贵的浮点运算,不必要地复杂化,并且是为更通用的 x ^ y 运算而设计的,其中 x 和 y 都是实数。
  • 你试过 double.TryParse 和 decimal.TryParse 吗?

标签: c# .net exponent


【解决方案1】:

如果您的文化使用. 作为小数分隔符,则只需double.Parse("1.50E-15") 即可。

如果您的文化使用其他东西(例如,),或者您想确保您的应用程序在每台计算机上都能正常运行,您应该使用InvariantCulture:

double.Parse("1.50E-15", CultureInfo.InvariantCulture)

【讨论】:

  • 已经想通了,但这是第一个可行的答案。
  • 是的,我注意到了。下次,您应该将解决方案作为答案发布,而不是编辑问题。
【解决方案2】:

标准的 double.Parse 或 decimal.Parse 方法在这里完成工作。

例子:

// AllowExponent is implicit
var number1 = double.Parse("0.5e10");
Debug.Assert(number1 == 5000000000.0);

// AllowExponent must be given explicitly
var number2 = decimal.Parse("0.5e10", NumberStyles.AllowExponent);
Debug.Assert(number2 == 5000000000m);

此外,有关详细信息,请参阅 MSDN 文章 Parsing Numeric Strings。只要将NumberStyles.AllowExponent 选项指定给Parse 方法(默认情况下是double),解析此类字符串就可以正常工作。

注意:正如提问者所指出的,例如“e10”的指数符号并不适用于所有文化。但是,指定 en-US 文化可确保其正常工作。我怀疑CultureInfo.InvariantCulture 也应该可以解决问题。

【讨论】:

  • @Dylan double test = double.Parse("1.509e10", NumberStyles.Float); // "输入字符串的格式不正确。"
  • 对于decimal.Parse,您需要明确指定 NumberStyles。
  • @OMGKurtNilsen:您为什么要在此处明确指定 NumberStyles?没有必要。如果您坚持明确指定,请同时包含 NumberStyles.AllowExponent。
  • 我认为这行不通,因为我的文化。当我指定“en-US”文化时,它起作用了。
  • @OMGKurtNilsen:有道理...... InvariantCulture 也可能有用。
【解决方案3】:

@Noldorin 是正确的试试这个代码:

string str = "-5e20";
double d = double.Parse(str);
Console.WriteLine(str);

【讨论】:

  • 感谢您的确认。不过,这可能应该属于评论,因为它只是在重复我所做的事情。 :-)
  • 我知道我最初确实添加了评论,但后来意识到你不能在评论中添加代码块
  • 不用担心。毕竟,请随意编辑我的答案(您的代表有特权吗?)。如果没有,那么这个例子现在就在那里。我们可能同时添加了它们。
【解决方案4】:

Math.Round 做得很好,它会重新编号以便删除,这里是如何使用它:

Math.Round(Double.Parse("3,55E-15"),2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 2014-05-05
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2019-08-31
    相关资源
    最近更新 更多