我有一个代表形状的类.Shape类有一个名为Angle的属性.我希望此属性的setter自动将值包装到范围[0,359]中.
不幸的是,简单_Angle = value % 360;
只适用于正数.在C#中-40 % 360 == -40
.谷歌calc 以我想要的方式做到了.值应为320.
什么是C#中最优雅的解决方案?
这是我到目前为止最好的方式:
public double Angle {
get { return _Angle; }
set {
if ( value >= 0 ) {
_Angle = value % 360;
}
else {
_Angle = value - (360 * ((int)(value / 360) - 1));
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
谢谢你们,我现在有:
public double Angle {
get { return _Angle; }
set {
_Angle = (value % 360) + ((value < 0) ? 360 : 0);
}
}
Run Code Online (Sandbox Code Playgroud)
..哪个好多了:)
虽然这适用于Java,但Java也具有相同的模数行为.(即-40 % 360 == -40
).
以下代码应该从[0.360),无论给定角度,正面还是负面.
public class Mod
{
public static int mod(int a, int b)
{
if (a < 0)
return b + (a % b);
else
return a % b;
}
public static void main(String[] args)
{
System.out.println(mod(40, 360)); // 40
System.out.println(mod(-40, 360)); // 320
System.out.println(mod(-400, 360)); // 320
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,当给定角度超过-360时有效.