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

JPR*_*ddy 2 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);
Run Code Online (Sandbox Code Playgroud)

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

编辑: 对于误导性问题,我们深表歉意.正如亨里克在他的回答中提到的正是我所面对的.

float f = 1111111111;
string s = f.ToString();
decimal amount;
decimal.TryParse(s, NumberStyles.Any, null, out amount);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 7

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

float f = 1111111111;
string s = f.ToString("r"); // r = roundtrip
float g = float.Parse(s);
Run Code Online (Sandbox Code Playgroud)

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

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

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

所以试图存储一个10位数字并期望它被准确存储是一个愚蠢的差事.

很难说你是否应该使用doubledecimal- 这取决于你真正想要存储的价值.如果它是重量或高度的"自然"值,我会选择double.如果它像价格一样是"人"价值,我会用decimal.