输入铸造问题

时间:2017-04-04 11:07:40

标签: c#

在将字符串解析为双倍时,我们面临着一个问题。我们需要将18位数字符串(< 123,456,789,012>。< 123456>)转换为double。它只返回小数点后的5位数。当我们试图减少数字的数字时,它工作得很好。我们附上了三个不同场景的屏幕截图。变量' S'是输入,retValue是输出值。

请帮助我们将123,456,789,012.123456转换为123456789012.123456

string s = "123,456,789,012.123456"; 
double retVal; 
System.Globalization.CultureInfo cInfo = new System.Globalization.CultureInfo(System.Web.HttpContext.Curr‌​ent.Session["culture‌​"].ToString()); 
retVal = double.Parse(s, NumberStyles.Any, cInfo);

Issue screen shot

2 个答案:

答案 0 :(得分:6)

double的精度最高为15位,请参阅MSDN

  

Double值最多包含15个十进制数字的精度,但内部最多保留17位数。

您应该使用decimalDecimal.Parse(..)28-29 significant digits

答案 1 :(得分:3)

您遇到了所有浮点数据类型(如double)固有的精度问题。如果您需要更精确的精确度,则应使用decimal代替:

string s = "987,654,321.123456";
decimal d = decimal.Parse(s);

查看实际操作:https://repl.it/Gtoy/0

编辑:正如Panagiotis Kanavos指出的那样,decimal也不完美。它使用128位而不是double的64位。然而,double使用其位来表示更大的数字,decimal使用它来表示更小的数字,准确度更高。

相关问题