Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 指数0值的十进制解析(0+;E3)_C#_Parsing_Decimal_Overflowexception - Fatal编程技术网

C# 指数0值的十进制解析(0+;E3)

C# 指数0值的十进制解析(0+;E3),c#,parsing,decimal,overflowexception,C#,Parsing,Decimal,Overflowexception,我们的中间层向我们发送序列化对象,有时由于服务器上java的一些数学操作,0作为0E+3。当反序列化对象时,我们得到一个XmlException-->System.OverflowException,因为该值对于十进制来说太大或太小 为什么decimal.Parse无法处理此转换 有没有办法保护我们的客户不受这些数字的影响?将其更改为float或double,它将正确解析它。尽管要小心,但精度会低得多(浮点数为7位,双精度为15-16位,十进制为28-29位)。如果计算结果是这样的话,Java可

我们的中间层向我们发送序列化对象,有时由于服务器上java的一些数学操作,0作为0E+3。当反序列化对象时,我们得到一个XmlException-->System.OverflowException,因为该值对于十进制来说太大或太小

为什么decimal.Parse无法处理此转换


有没有办法保护我们的客户不受这些数字的影响?

将其更改为float或double,它将正确解析它。尽管要小心,但精度会低得多(浮点数为7位,双精度为15-16位,十进制为28-29位)。

如果计算结果是这样的话,Java可能会将其作为双精度进行计算(这意味着您也不需要额外的十进制精度)。。。考虑使用双代替十进制。< /P> 如果必须,只需使用正则表达式手动删除
E[+-]?([0-9]+)$
,然后自己进行乘法。或者将
^0E
作为特例进行匹配(似乎是
数字样式。任何
都无法处理),然后返回0即可。

您可以尝试:

decimal.Parse(numberText, System.Globalization.NumberStyles.Any)
编辑:

不幸的是,这不适用于0E+3

作品:

Console.WriteLine(decimal.Parse("0", System.Globalization.NumberStyles.Any));
Console.WriteLine(decimal.Parse("123.45", System.Globalization.NumberStyles.Any));
Console.WriteLine(decimal.Parse("1.35E+6", System.Globalization.NumberStyles.Any));
Console.WriteLine(decimal.Parse("1.54E-5", System.Globalization.NumberStyles.Any));
不起作用:

Console.WriteLine(decimal.Parse("0E+3", System.Globalization.NumberStyles.Any));
问题编号是否始终为0E+3

如果是这样,您可以编写一个助手方法来处理此问题:

decimal ParseDecimal(string number)
{
    if (number.Equals("0E+3", StringComparison.OrdinalIgnoreCase))
    {
        return 0;
    }

    return decimal.Parse(number, System.Globalization.NumberStyles.Any);
}

您可以创建并使用扩展方法来解析指数格式或十进制格式吗?您确定这里需要.NET十进制格式吗?你尝试过浮动还是双精度?这是一个金融系统,所以我们不能承受在分数股票上失去精度。java方面使用的是BigDecimal。Java还接收一个xml文档,该文档在某些数量字段中包含指数,然后减去这些值。有时这些值的结果是0。当java管理BigDecimal并以指数开始时,它是否也将减法结果作为指数返回?在本例中,它是3。我不知道它是否有其他价值观。但是,我们没有管理解析。json组件中正在对其进行反序列化。是否有方法告诉json组件如何解析某些内容,或者将其映射到什么类型?(您可以创建一个可以反序列化0E+3字符串的自定义类型)我想这是decimal.Parse中的一个错误,在Microsoft Connect()上提出这个问题可能是值得的。您可能需要编写一个自定义反序列化程序(不知道如何进行),或者将它们指定为XML上的字符串并手动解析。我同意这是一个bug。我不知道为什么解析例程不能处理这个问题。我想我可能必须找到一种方法来定制序列化程序,或者将值转换为字符串,然后手动解析为十进制。不过C#可以处理0.000E+3并将其转换为十进制0。它不能处理0.00E+3。它给出了同样的错误。