В ссылке, которую вы упомянули в своем вопросе, автор сказал:
Для Android API 24 и выше для этого требуется другой код, так как API изменился.
blockquote>Таким образом, вы должны проверить версию вашего устройства, используя методы, подобные , , а затем вызвать соответствующую функцию.
Хотя это для 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.
В то время как Ваше решение работает на проблему, у Вас есть алгоритм, на самом деле не идентично тому, используемому Google. Это отличается при использовании отрицательного делителя.
public double GoogleModulo(double value, double divisor)
{
long q = (long)Math.Floor(value / divisor);
return value - q * divisor;
}
Console.WriteLine(GoogleModulo( 40, 360)); // 40
Console.WriteLine(GoogleModulo( -40, 360)); // 320
Console.WriteLine(GoogleModulo(-400, 360)); // 320
Console.WriteLine(GoogleModulo( 40, -360)); // -320
Проверьте ответ Google на последнее вычисление здесь.
Алгоритм объяснен на Википедию и приписан Donald Knuth.
Это должно дать Вам необходимые результаты
public double Angle {
get { return _Angle; }
set { _Angle = value % 360 + (value % 360 < 0 : 360 : 0); }
}
Я предполагаю, что 360 градусы, и Вы пытаетесь найти, где в {0, 360} угол находится.
Ультрасовременная операция является очень медленной. Если возможная замена битовой маской.
код coobird является довольно хорошим..., но является очень медленным, потому что он делает ультрасовременную операцию. Если возможно масштабироваться, Ваши данные, чтобы быть в некотором питании два располагаются, то можно улучшить скорость приблизительно на порядок величины (по крайней мере в 2 или 3 раза быстрее) при помощи небольшой маски.
C код:
#define BIT_MASK (0xFFFF)
if (a < 0) {
return b + (a & BIT_MASK);
} else {
return a & BIT_MASK;
}
Не стесняйтесь делать #define чем-то, что является временем выполнения. И не стесняйтесь корректировать битовую маску, чтобы быть безотносительно питания два, что Вам нужно. Как 0xFFFFFFFF или питание два Вы выбираете реализацию.
(360 * Math.floor(Math.abs(value) / 360) + value) % 360
Если Ваши значения не будут дико из диапазона, можно сделать немного цикла.
while (value < 0) {
value = value + 360;
}
while (value > 360) {
value = value - 360;
}
// go 'round once
набор {_Angle = (оценивают + 360), % 360}