繁体   English   中英

如何检查Double是否可以转换为Int32?

[英]How to check if a Double can be converted into a Int32?

我有一个double值,我想转换成Int32。 如果可以转换,我如何在转换前检查?

有时值未定义,转换为Int32会抛出OverflowException。

我已经尝试过这样测试:

double value = getSomeValue();
if (value == Double.NAN) {
value =0;
}
int v = Convert.ToInt32(value);

但这并未涵盖所有情况。

也许这个?

更新 :我相信下面的更新解决了边缘情况。 我已经针对每种情况测试了这个问题,我可以考虑针对直接尝试Convert.ToInt32并捕获异常的方法验证输出。

static bool TryConvertToInt32(double value, out int result)
{
    const double Min = int.MinValue - 0.5;
    const double Max = int.MaxValue + 0.5;

    // Notes:
    // 1. double.IsNaN is needed for exclusion purposes because NaN compares
    //    false for <, >=, etc. for every value (including itself).
    // 2. value < Min is correct because -2147483648.5 rounds to int.MinValue.
    // 3. value >= Max is correct because 2147483648.5 rounds to int.MaxValue + 1.
    if (double.IsNaN(value) || value < Min || value >= Max)
    {
        result = 0;
        return false;
    }

    result = Convert.ToInt32(value);
    return true;
}

检查Double.IsNaN是否确定它在int.MinValue和int.MaxValue之间,

您可以与Int32的范围进行比较。

if(value <= (double)Int32.MAX_VALUE && value >= (double)Int32.MIN_VALUE)
    return (Int32)value;
return 0;

当然,如果你想在double太大时返回Max / Min值,你可以这样做:

if(value <= (double)Int32.MAX_VALUE && value >= (double)Int32.MIN_VALUE)
    return (Int32)value;
if(value > (double)Int32.MAX_VALUE)
    return Int32.MAX_VALUE;
if(value < (double)Int32.MIN_VALUE)
    return Int32.MIN_VALUE;
return 0;

尝试这样的事情:

double d = Double.NaN;
int i;
if(Int32.TryParse(d.ToString(), out i))
{
    Console.WriteLine("Success");
    Console.WriteLine(i);
} else {
    Console.WriteLine("Fail");
}   

你可以尝试这样的事情:

(value>=Int32.MinValue)&&(value<=Int32.MaxValue)

这可能会错误地拒绝超出int值范围的值,但会将其四舍五入。 所以你可能想要稍微扩展一下间隔。

例如, Int32.MaxValue+0.1被拒绝。

你想如何对待非整数双打? 此代码接受它们并静默地舍去小数部分。 基于int.TryParse(value.ToString(),...)会认为这样的双精度无效。

除非你绝对需要性能,否则使用异常处理呢?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM