Исключение переполнения в C# для преобразования числа с плавающей запятой в десятичное

Я получаю исключение переполнения, когда Convert.ToDecimal(float number here) называется. Я читаю из байтовой строки и надеюсь преобразовать байтовый массив в десятичное число.

byte[] hexbyte = {45, 6, 7, 29};
float myFloat = BitConverter.ToSingle(hexbyte, 0);

//Make sure the float can be converted to decimal
if (!float.IsNaN(myFloat) ||
    !float.IsInfinity(myFloat) ||
    myFloat < (float)decimal.MaxValue ||
    myFloat > (float)decimal.MinValue)
{
    try {
        myFloatD = Convert.ToDecimal(myFloat);
    }
    catch (Exception ex)
    {
        Debugger.Log(0, "1", ex.ToString());
        return 0;
    }
}
else
    return 0;

myFloat = (float)Math.Round(myFloatD, 2); // 1 indicates the decimal places

Даже когда я наложил ограничения, чтобы проверить, является ли число с плавающей запятой слишком большим / слишком маленьким / бесконечным для преобразования, код все равно заканчивается исключением catch...

1 ответ

Решение

Вы используете или операторы, где вы должны использовать и операторы. Любое число с плавающей запятой, которое является NaN, бесконечным, > decimal.MaxValue или

Вот что вам нужно для обеспечения:

myFloat < (float)decimal.MaxValue && myFloat > (float)decimal.MinValue

Вот что вы на самом деле гарантируете:

myFloat < (float)decimal.MaxValue || myFloat > (float)decimal.MinValue

Последнее всегда верно для любого данного числа с плавающей запятой, даже тех, которые находятся за пределами допустимых границ десятичного типа.

Другие вопросы по тегам