将科学计数法表示的数字从字符串转换为双精度或十进制数。

19

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

更新:我找到了从指数表示法中解析数字,但这些示例对我来说无法工作,除非我指定了一个区域设置。

解决方案:

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

你可以使用以下链接:http://msdn.microsoft.com/zh-cn/library/system.math.exp.aspx - Security Hound
@Ramhound:这种方法并不理想,原因有很多;首先它使用了昂贵的浮点运算,其次它过于复杂,还是为更一般的实数 x ^ y 运算设计的,而在这里 x 和 y 都是实数。 - Noldorin
你尝试过使用 double.TryParse 和 decimal.TryParse 吗? - Emmanuel N
4个回答

23
如果您的文化使用 . 作为小数点分隔符,那么只需要使用 double.Parse("1.50E-15") 即可。
如果您的文化使用其他字符作为小数点分隔符(例如),或者希望确保您的应用程序在每台计算机上都以相同的方式工作,那么您应该使用InvariantCulture
double.Parse("1.50E-15", CultureInfo.InvariantCulture)

已经解决了这个问题,但这是第一个可行的答案。 - OMGKurtNilsen
6
我注意到了。下次,请将解决方案发布为答案,而不是编辑问题。 - svick

10

标准的double.Parsedecimal.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文章“解析数字字符串”以获取更多信息。只要对Parse方法指定了NumberStyles.AllowExponent选项(默认适用于double),解析此类字符串就会正常工作。

NB:正如提问者所指出的,“e10”这样的指数表示法并不适用于所有文化。然而,指定 en-US 文化确保它可以正常工作。我猜 CultureInfo.InvariantCulture 也应该可以做到这一点。


@Dylan double test = double.Parse("1.509e10", NumberStyles.Float); // "输入字符串格式不正确。" - OMGKurtNilsen
1
对于 decimal.Parse,你需要显式指定 NumberStyles。 - Noldorin
@OMGKurtNilsen:为什么你在那里明确指定NumberStyles?没有必要这样做。如果您坚持要明确指定,请同时包括NumberStyles.AllowExponent - Noldorin
1
我认为这不会起作用,因为我的文化背景不同。当我指定“en-US”文化背景时,它可以正常工作。 - OMGKurtNilsen
@OMGKurtNilsen:有道理...InvariantCulture 也可能行得通。 - Noldorin
显示剩余2条评论

2

@Noldorin是正确的,请尝试以下代码:

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

2
谢谢确认。不过这可能更适合作为评论,因为它只是在重申我已经做过的事情。 :-) - Noldorin
我知道我最初是作为注释添加的,但后来意识到你不能在注释中放置代码块。 - Kevin Holditch
没问题。随意编辑我的回答,毕竟你有权限(是吗?)。如果不行,现在也有例子了。 - Noldorin

1

Math.Round 函数非常好用,可以对数字进行渲染以去除多余的小数位,以下是使用方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接