1

Convert.ToDecimal(float number here)が呼び出されると、オーバーフロー例外が発生します。バイト文字列から読み取り、バイト配列を 10 進数に変換したいと考えています。

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

フロートが変換に対して大きすぎる/小さすぎる/無限大であるかどうかをチェックするために制約を設定しても、コードは依然としてキャッチ例外で終了します...

4

1 に答える 1

2

and 演算子を使用する必要がある場所に or 演算子を使用しています。NaN、infinite、> decimal.MaxValue、または < decimal.MinValue である float は、if 基準を渡すことができますが、これらすべてが同時に行われるわけではありません。

確認する必要があるのは次のとおりです。

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

実際に確認しているのは次のとおりです。

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

後者は、10 進数型の有効な範囲外にあるものであっても、特定の浮動小数点数に対して常に当てはまります。

于 2014-10-27T02:07:17.877 に答える