是否可以创建一个带小数参数的方法,只接受0到1的值?
示例:
public decimal GetSamplingError(decimal percent){
decimal result = 0;
result = 100*percent;
return result;
}
是否可以控制参数百分比在0和1之间压缩?
谢谢,抱歉我的英语不好。
答案 0 :(得分:4)
没有办法控制参数的范围,你能做什么,是在函数内部控制它,并为函数添加注释
public decimal GetSamplingError(decimal percent){
if(percent > 1)
percent = 1;
else if(percent <0)
percent = 0;
return 100*percent;
}
如果参数不在dsired范围内,请提高ArgumentOutOfRangeException
,但这取决于您希望如何管理应用的 worklfow 。
答案 1 :(得分:1)
没有编译时检查这个的方法。最好的解决方案是在运行时检查参数:
public decimal GetSamplingError(decimal percent)
{
if (percent < 0m || percent > 1m)
{
throw new ArgumentException("Percent should be between 0 and 1!", "percent");
}
decimal result = 0;
result = 100*percent;
return result;
}
除了Tigran的方法之外,当传递无效参数时,这将抛出异常。我更喜欢这种方法而不仅仅是改变百分比值,因为它实际上会让你注意到你传递了错误的值。
当您使用Microsoft的Code Contracts
时,您可以添加一个合同,以确保该值在特定范围内。启用静态检查后,您将在compile-time
收到错误消息。
Contract.Requires(percent > 0m && percent < 1m, "Percent must be between 0 and 1");
答案 2 :(得分:1)
我会创建我自己的Percent
类型,并进行范围检查,正如其他人建议的那样以及其他一些内容。这样,Percent
在您的应用程序中就是它自己的实体,每个人都知道何时以及如何使用它。简单的十进制也可能有效,但我更喜欢键入的方法。
internal class Percent
{
private readonly decimal _value;
public decimal Value
{
get { return _value; }
}
public Percent(decimal value)
{
_value = (100 * value);
if (value < 0m || value > 1m)
{
throw new ArgumentOutOfRangeException("value");
}
}
public override string ToString()
{
return String.Format("{0}%", _value);
}
public override int GetHashCode()
{
// HashCode implementation;
}
public override bool Equals(object obj)
{
// Equals implementation;
}
}
答案 3 :(得分:0)
你必须这样做:
public decimal GetSamplingError(decimal percent){
if (percent < 0m || percent > 1m)
throw new ArgumentOutOfRangeException("percent", "Must be between 0 and 1.");
// rest of method
}
当然,也可以使自己的struct
名为DecimalBetweenZeroAndOne
,它是不可变的,并且包含一个十进制字段readonly
,并且在那里写一张支票以保证该字段的值始终在所需范围内。
答案 4 :(得分:0)
如果值不符合您的预期,则可以验证输入并抛出异常:
decimal getPercentage(decimal val)
{
if (val < 0 || val > 1)
throw new ArgumentException();
return val * 100;
}