将指数数转换为十进制数1.11111117E + 9 - 尾随数字变为零

时间:2011-01-18 11:31:51

标签: c# parsing decimal tryparse exponential

我正在尝试转换和指数数字1.11111117E + 9,这实际上是一个10位数字'1111111111'。当我尝试使用decimal.TryParse方法转换此指数时,它将最后3位数字设为零,并将数字设为“ 111111000 ”。任何10位数字都会发生这种情况。

   decimal amount;
   decimal.TryParse("1.11111117E+9", NumberStyles.Any, null, out amount);

这很奇怪,但我无法弄清楚这里有什么问题,有人能告诉我这有什么问题吗?

修改 对于误导性问题,我们深表歉意。正如他在答案中提到的 Henrik 正是我所面对的。

float f = 1111111111;
string s = f.ToString();
decimal amount;
decimal.TryParse(s, NumberStyles.Any, null, out amount);

这将始终返回1111111000?如何解决此问题以获得正确的值?从float数据类型更改为Double或Decimal是解决方案还是其他任何内容?

4 个答案:

答案 0 :(得分:7)

浮动值往返很容易......

float f = 1111111111;
string s = f.ToString("r"); // r = roundtrip
float g = float.Parse(s);

现在fg将是相同的...但这并不意味着任何一个值都是1111111111 ...因为该值无法表示为浮。最接近的值可以表示为浮点数是1111111168 ...这就是为什么你在科学表示结束时得到7。

基本上,您不应该首先使用float。来自System.Single的文档:

  

默认情况下,Single值仅包含7个十进制数字的精度,但内部最多保留9位数。

因此,试图存储一个10位数的数字,并期望它被准确存储是一个愚蠢的差事。

很难说您是应该使用double还是decimal - 这取决于您真正想要存储的价值。如果它是重量或高度的“自然”值,我会选择double。如果它是价格的“人”价值,我会使用decimal

答案 1 :(得分:4)

decimal amount;
decimal.TryParse("1.11111117E+9", NumberStyles.Any, 
    CultureInfo.InvariantCulture, out amount);

按预期将金额设定为1111111170M。

请注意CultureInfo.InvariantCulture,因此它不依赖于您的本地设置。

更新:我怀疑你的真实代码看起来像这样:

float f = 1111111111;
string s = f.ToString();
decimal amount;
decimal.TryParse(s, NumberStyles.Any, null, out amount);

f在debuger中显示为1.11111117e + 9,s为1.111111e + 9,金额为1111111000M。 所有这一切的原因是浮动的精度有限。

答案 2 :(得分:2)

试试这个, 它对我来说效果更好

 decimal dec = Decimal.Parse("1.11111117E+9", System.Globalization.NumberStyles.Any);

答案 3 :(得分:0)

您应该解析double,而不是decimaldecimal没有科学记数法。

更新:确切的整数值为1111111170。不是111111111,大约是应该的10倍。