Vous n'avez pas recevoir -8
, vous recevez -8.XXXXXXe-17
. Notez le e-17
à la fin. C'est la notation scientifique, donc votre numéro est en réalité -0.00000000000000008XXXXX
. Vous pouvez voir le nombre float sans notation scientifique en utilisant angle.toFixed(20)
. Le nombre est le nombre de décimales que vous voulez montrer. Pourquoi avez-vous des nombres aussi petits si vous augmentez et diminuez seulement de 0.01
? pouvez-vous demander. Cela arrive parce que les points flottants ne sont pas exacts car les nombres décimaux sont impossibles à "enregistrer jusqu'à la fin", pas comme les nombres entiers. Pensez à 1/3
ayant un nombre infini de décimales, par exemple. Ici vous pouvez en savoir plus sur JavaScript et la précision du flotteur: Dealing with float precision in Javascript
L'autre problème est d'avoir un angle négatif (si petit, mais toujours négatif même si vous vérifiez réellement les angles négatifs). Cela se produit parce que vous vérifiez les angles négatifs AVANT de l'augmenter/diminuer, donc si vous avez votre multiplicateur comme négatif et votre angle comme, disons, 0.0001whatever
(à cause du problème de précision du flotteur), il est toujours supérieur à zéro, donc vous multipliez toujours être négatif, mais est en fait plus grand que votre angle, donc quand le multiplicateur est appliqué, l'angle sera négatif.
Je peux penser à cette façon de résoudre ce problème:
let angle = 0
let multiplier = .01
function raf() {
angle = angle+multiplier;
if(angle > 1 || angle < 0) {
multiplier = -multiplier
angle = angle<0?0:1;
}
console.log(angle.toFixed(20))
requestAnimationFrame(raf)
}
requestAnimationFrame(raf)
Avec cela, vous vérifiez si votre angle est à l'intérieur des limites retravaillée, de sorte que vous surmonterez le problème de précision: https://codepen.io/anon/pen/eWppGy
Une autre façon peut être d'utiliser des entiers (parce qu'ils ne sont pas le problème de précision, comme je l'ai dit ci-dessus) et de diviser l'angle par 100 pour aller au travail avec elle, comme ceci:
let angle = 0
let multiplier = 1
function raf() {
angle = angle+multiplier;
if(angle >= 100 || angle <= 0) {
multiplier = -multiplier;
angle = angle<=0?0:100;
}
console.log(angle/100)
requestAnimationFrame(raf)
}
requestAnimationFrame(raf)
Stylo: https://codepen.io/anon/pen/XRmmVq
Merci! Je comprends le problème et votre solution fonctionne bien! :) – Mourtazag
@Mourtazag Heureux qu'il a aidé: P –