在VB.NET中的绝对值

11

在VB.Net中如何获取一个数的绝对值?

有没有内置的函数?我知道我可以编写一个自己的函数,但是我想先了解是否已经有现成的函数。这似乎非常简单,我可能只需要三行代码就能实现,所以如果没有内置函数,我会很惊讶的...

谢谢!

4个回答

20

1
好吧,至少MSDN链接有子链接提到潜在的溢出问题,即使没有人会想要真正点击它们。 - MusiGenesis
2
顺便说一句,我认为你应该因为在The Daily WTF上的工作而立即获得2万声望奖励。 - MusiGenesis

11

冒着被踩的风险,你可能需要编写自己的绝对值方法,具体取决于你要用它做什么。以下代码片段(抱歉它是使用C#编写的,但是相同的原则适用):

short i = -32768;
int iAbs = Math.Abs(i);

这段代码可以顺利编译,但运行时第二行会抛出OverflowException异常并提示"Negating the minimum value of a twos complement number is invalid."。在这种情况下,因为i是short类型,编译器选择了接受short并返回short的Math.Abs重载方法,而+32768不是一个有效的short值,所以即使您认为通过将iAbs设置为int来预见该问题,该方法仍会引发异常。

short i = -32768;
int iAbs = Math.Abs((int)i);

这段代码可以编译并执行,但这种编码方式有些笨拙。在我看来,这是一个非常难以遇到的错误,因为在真实世界中很少遇到(因为每种类型只有一个值会生成此异常)。不幸的是,每当我使用Math.Abs对标准化音频数据(通常是short[]数组)进行操作时,就会遇到这个错误,所以我已经养成了编写自己的Math.Abs包装器的习惯,它可以处理所有这些问题并返回一个double值:

public double AbsThatDoesntSuck(short value)
{
    return Math.Abs((double)value);
}

我需要为其他需要处理的类型提供重载,以此来理解为什么Math.Abs被编写成这种行为方式,但它肯定会让不知情的人感到困扰。


好的,谢谢!我可以检查数字是否小于零,如果是,则将其乘以负一,这始终有效,除非该数字过大以至于Windows无法解析。 - Cyclone
这样更好:返回 (i/i)*i - beppe9000

1

1

这个函数是 Math.Abs


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接