如果我想将 double 转换为 string 并返回到完全匹配的 double,我会使用类似的东西:
double d1 = 1 / 3.0;
string s = d1.ToString("R");
double d2 = double.Parse(s);
但是,“R”格式没有为 decimal 类型定义(您会得到“FormatException:格式说明符无效”)。
如何生成小数类型的往返字符串?
decimal
往返的默认输出格式,因此您无需执行任何特殊操作。从这个意义上来说,它就像int
。
Decimal
实际上是一个二进制十进制值(它使用10的基数,而不是Double
中的2),这就是为什么不需要像
ToString("R")
这样的特殊精确表示;
Decimal value = 123.456m;
String result = value.ToString(CultureInfo.InvariantCulture); // <- That's enough
详情请参阅:
http://csharpindepth.com/articles/general/decimal.aspx
编辑:从.Net 7开始,您可以使用INumber接口创建通用(
decimal
和double
甚至异国情调的Half
)扩展方法(参见SandRock的评论如下):
using System.Globalization;
using System.Numerics;
...
public static class MyNumberExtensions {
public static string ToInvariantString<T>(this T value)
where T : INumber<T>, IFormattable {
return value.ToString("R", CultureInfo.InvariantCulture);
}
}
然后
double d = 123.45;
decimal de = 446.93m;
int i = 456;
Half h = (Half)(5.1);
Console.WriteLine(string.Join(Environment.NewLine,
d.ToInvariantString(),
de.ToInvariantString(),
i.ToInvariantString(),
h.ToInvariantString()));
输出:
123.45
446.93
456
5.1
如果你尝试,
decimal d1 = 1m / 3;
string s = d1.ToString();
decimal d2 = decimal.Parse(s);
// where d1 == d2 = true
您会发现不需要任何额外的格式选项即可获得正确的
string
表示形式。