Annahme:if
Aussagen und die abs
Funktion als die Liste der verbotenen Funktionen erlauben dies nicht enthalten.
Hier ist eine Lösung. Was Sie tun können, ist, den Eingabewert um 1 zu subtrahieren, bis Sie zu einem Punkt kommen, an dem es kleiner als 1 wird. Die nach diesem Punkt erzeugte Zahl ist die Bruchzahl der Zahl (dh wenn unsere Zahl 3,4 war, die Bruchzahl Komponente ist 0,4). Sie würden dann überprüfen, ob die Bruchkomponente, die wir f
nennen, weniger als 0,5 ist. Wenn dies der Fall ist, bedeutet dies, dass Sie abrunden müssen und die Eingabezahl mit f
subtrahieren soll. Wenn die Zahl größer als 0,5 oder gleich 0,5 ist, würden Sie die Eingangsnummer von (1 - f)
hinzufügen, um die nächsthöhere Nummer zu erreichen. Dies gilt jedoch nur für positive Werte. Für negative Werte, round
in MATLAB rundet auf negative Unendlichkeit, so was wir tun sollten, ist die absolute Wert der Eingangsnummer und tun diese Subtraktion, um den Bruchteil zu finden.
Sobald wir dies tun, überprüfen wir dann, was der Bruchteil ist gleich, und dann abhängig von dem Vorzeichen der Zahl, entweder wir addieren oder subtrahieren entsprechend. Wenn der Bruchteil kleiner als 0,5 ist und wenn die Zahl positiv ist, müssen wir um f
subtrahieren, sonst müssen wir durch f
hinzufügen. Wenn der Bruchteil größer oder gleich 0 ist.5, wenn die Zahl positiv ist, müssen wir von (1 - f)
hinzufügen, sonst ziehen wir durch (1 - f)
daher davon aus, dass num
die Eingangszahl von Interesse ist, würden Sie tun:
function out = round_hack(num)
%// Repeatedly subtract until we get a value that less than 1
%// i.e. the fractional part
%// Also make sure to take the absolute value
f = abs(num);
while f > 1
f = f - 1;
end
%// Case where we need to round down
if f < 0.5
if num > 0
out = num - f;
else
out = num + f;
end
%// Case where we need to round up
else
if num > 0
out = num + (1 - f);
else
out = num - (1 - f);
end
end
Beachten Sie, dass diese wird für größere Werte von num
langsam sein. Ich habe dies auch in eine Funktion zum leichteren Debuggen eingepackt. Hier sind ein paar Beispiel läuft:
>> round_hack(29.1)
ans =
29
>> round_hack(29.6)
ans =
30
>> round_hack(3.4)
ans =
3
>> round_hack(3.5)
ans =
4
>> round_hack(-0.4)
ans =
0
>> round_hack(-0.6)
ans =
-1
>> round_hack(-29.7)
ans =
-30
können Sie prüfen, ob diese mit round
Funktion des MATLAB für die oben genannten Testfällen übereinstimmt.
'Isinteger' prüft auf Werttyp - Standard MATLAB Typ ist doppelt. 'isinteger (5)' gibt '0' zurück. Ist ['fix'] (http://uk.mathworks.com/help/matlab/ref/fix.html) gesperrt? –
Ich denke ja, da steht geschrieben, dass ich while loop dafür benutzen muss: D Meine Power liegt weit über diesem Level: D –
'fix' ist ähnlich wie' floor' aber es läuft auf Null ab. 'floor' läuft auf minus unendlich ... also ja ich würde denken, dass' fix' auch verboten ist. – rayryeng