2

我正在尝试转换指数数字 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?如何解决此问题以获得正确的值?从浮点数据类型将其更改为 Double 或 Decimal 是解决方案还是其他?

4

4 回答 4

7

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

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

现在fg将是相同的...但这并不意味着任何一个值都恰好是 1111111111... 因为该值不能表示为 float。可以精确表示为浮点数的最接近的值是 1111111168 ......这就是为什么你在科学表示的末尾得到 7 的原因。

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

默认情况下,Single 值仅包含 7 位精度的十进制数字,尽管内部维护最多 9 位数字。

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

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

于 2011-01-18T12:58:55.097 回答
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 在调试器中显示为 1.11111117e+9,s 为 1.111111e+9,数量为 1111111000M。这一切的原因是浮点数的精度有限。

于 2011-01-18T11:48:20.570 回答
2

试试这个,它更适合我

 decimal dec = Decimal.Parse("1.11111117E+9", System.Globalization.NumberStyles.Any);
于 2013-08-21T06:44:23.473 回答
0

你应该解析double,而不是decimal。科学记数法与decimal.

更新:确切的整数值是1111111170. 不是111111111比它应该的少大约 10 倍。

于 2011-01-18T11:37:39.783 回答