我有一个代表形状的类.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)); } } }
编辑:
谢谢你们,我现在有:
public double Angle { get { return _Angle; } set { _Angle = (value % 360) + ((value < 0) ? 360 : 0); } }
..哪个好多了:)
虽然这适用于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 } }
请注意,当给定角度超过-360时有效.