如何不将双精度转换为整数 C#

本文关键字:整数 转换 双精度 何不 | 更新日期: 2023-09-27 18:35:44

好的,人们让我尝试清除最后一个 itme。我有一个对象 a,我想检查它的值是双精度、整数还是字符串。

例如: -如果对象 A = "12.3" 或 A = 12.3,它应该能够转换为 double 并在转换为 int 时抛出。如果对象 a = "12" 或 a = 12 或 a = 12.0,它应该能够在转换为 double 时转换为 int 和抛出。

如果对象 a="apple",它应该同时抛出 double 和 int。

希望这次我清楚了。但Timwi的解决方案实际上为我解决了这个问题。:-)

如何不将双精度转换为整数 C#

我认为你有一个双精度,如果它是一个整数,你想把它转换为 int,否则就会抛出。这是你想要的吗?

public static int ToInt32(double val)
{
    if (val % 1 != 0)
        throw new FormatException("The value is not an integer.");
    return Convert.ToInt32(val);
}

我怀疑在您的示例中a属于 object 类型,而实际代码有点像这样:

int myToInt(object a)
{
    return Convert.ToInt32(a);
}

但是如果a是整数,您希望抛出它。那么这个怎么样:

int myToInt(object a)
{
    if (a is double)
        throw new ArgumentException("a", "Must not be a double");
    return Convert.ToInt32(a);
}

既然我们都完全猜测OP在这里想要什么,所以我再试一次。假设你想要一个当且仅当值被截断时抛出的方法,请尝试如下操作:

int MyToInt32(double value)
{
    if (value != Math.Floor(value))
        throw new ArgumentException("value", "The value must not have a fractional part");
    return (int) value;
}

但这可能是一个相当糟糕的主意。

var a = 12.34;
int c = Int32.Parse(a.ToString(), NumberStyles.Integer,
                    CultureInfo.InvariantCulture);

如果数字的字符串表示形式不是整数,这将引发异常。它的文档在这里。

第一次转换.Int32(double) 不会截断采用整数部分和排除小数部分的值。 事实上,它返回舍入值。

值,舍入到最接近的 32 位有符号整数。如果值为 在两个整数之间的中间,返回偶数;那 是,4.5 转换为 4,5.5 转换为 6。

强制转换将截断该值,并将采用整数部分并丢弃小数部分。

对于您的问题

是否有一个自定义的 c# 方法,我可以通过它抛出格式 异常或其他东西,当我尝试将双精度转换为整数时。 ??

如果传递给它的值不是有效的双精度值,Convert.ToInt32会引发异常。

例如
 var val = "12.54A";
 int iVal = Convert.ToInt32(val);

而如果你尝试使用 int iVal = (int) val; 来转换它,会给你编译错误。

你能尝试使用数学吗?您可以尝试为双精度添加一些值,以确保它比 int 更大(或更小)。
然后尝试转换(这将返回错误)和相反的数学函数。

仍然不知道为什么要抛出错误...
双 -> int 将起作用,如果变量位于 int 边框之间

使用 is 怎么样

if( x is int )
{
    // convert here
}
else
{
    throw new Exception("Not an int");
}

使用演员表

var a = 12.34
int integer = (int)a;