我正在尝试转换和指数数字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是解决方案还是其他任何内容?
答案 0 :(得分:7)
浮动值往返很容易......
float f = 1111111111;
string s = f.ToString("r"); // r = roundtrip
float g = float.Parse(s);
现在f
和g
将是相同的...但这并不意味着任何一个值都是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
,而不是decimal
。 decimal
没有科学记数法。
更新:确切的整数值为1111111170
。不是111111111
,大约是应该的10倍。