我试图在两种情况下防止溢出,一种是将long与float相乘,另一种是在添加两个long时.
喜欢:
public static long multiplyLong(long value, float multiplier)
{
if (value * multiplier > long.MaxValue)
{
Debug.Log("greater then max value");
return value = long.MaxValue;
}
else
{
Debug.Log("not greater then max value");
return (long) (value * multiplier);
}
}
public static long addLong(long value, long adder)
{
if(value + adder > long.MaxValue)
{
Debug.Log("greater then max value");
return value = long.MaxValue;
}
else
{
Debug.Log("not greater then max value");
return value + adder;
}
}
“multiplyLong”完美地运行,而“addLong”不能像它应该的那样工作.当使用addLong时,会有溢出,它不会检测到溢出.我认为这很奇怪,因为代码似乎没问题.
有人能帮我吗?
“检查”不是一个选项顺便说一句.
解决方法:
就像@Bradley说的那样,你的溢出检查会出现溢出.但问题比这更重要.
让我们先看看这一行
if(value + adder > long.MaxValue)
这里,值和加法器都是long,将它们加在一起会导致很长.但问题是longs会自动翻转而不是抛出异常,所以如果你的值长时间大于最大值,你就会得到一些看似随意的其他长值.
现在应该清楚为什么你不想这样做但是在我们进入正确的解决方案之前,让我们看看你的multiplyLong方法.具体来说,以下行
if (value * multiplier > long.MaxValue)
在这个值是一个long,乘数是一个浮点数,并将它们相乘得到一个浮点数,可以很容易地检查一个很长的时间,这样你的支票就会起作用.
但是如果value * multiplier的值大于long.MaxValue并将其转换为long?
答案是你得到长.MinValue,肯定不到很长.MaxValue
关于这个话题还有很多可以说的,但这应该足以说服你,你所做的事情并不好.
现在,你应该怎么做?我推荐使用十进制类型有两个原因.一,它有一个比长的更大的范围(十进制可以达到79228162514264337593543950335,其中long只能达到9223372036854775807),另一个原因是它在溢出发生时抛出显式异常.
例如,这是我的代码的重写版本
public static long multiplyLong(decimal value, decimal multiplier)
{
try
{
return value*multiplier;
}
catch (OverflowException e)
{
Debug.Log("greater then max value");
return decimal.MaxValue;
}
}
public static long addLong(decimal value, decimal adder)
{
try
{
return value+adder;
}
catch (OverflowException e)
{
Debug.Log("greater then max value");
return decimal.MaxValue;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。