2011-02-23 4 views
4

Je transfère du code de Processing à Java, et un problème que j'ai rencontré est que le précompilateur du traitement transforme les doubles en flottants. Cependant, dans Eclipse, j'ai dû explicitement convertir mes valeurs en float. Cependant, j'ai des erreurs que je ne comprends pas. Par exemple, ne devrait pas mettre un f à la fin de cette déclaration fixer la discordance de type (incompatibilité de type: ne peut pas convertir de double à float)?Je ne sais pas comment lancer pour flotter en Java

springing[n] = .05*(.17*(n+1))f; 

Et même sur des instructions plus simples comme ceci, j'obtiens une incompatibilité de type. Qu'est-ce que je fais mal?

float theta = .01f; 
+0

Avez-vous besoin d'utiliser des flottants, ou est-ce que votre programme fonctionnerait aussi bien (avec un peu plus d'utilisation de la mémoire et des résultats plus précis) avec le double? Cela pourrait être plus facile :-) –

+0

Je ne suis toujours pas clair sur la différence entre les doubles et les flotteurs. Y a-t-il une page qui explique cela? – Miles

+0

un flottant est une valeur à virgule flottante à simple précision de 32 bits, un double est à double précision de 64 bits, voir http://en.wikipedia.org/wiki/Floating_point – Jesper

Répondre

9

Eh bien, votre deuxième déclaration est correcte selon les normes de Java, mais dans votre premier exemple Java tente probablement de vous empêcher de se convertir en double de flotte en raison d'une perte de précision qui doit être posée explicitement par le programmeur , comme si:

double a = //some double; 
float b = (float) a; //b will lose some of a's precision 
+0

Er ... est que '(float) 'intentionnel ou est-ce une faute de frappe? – Mehrdad

+0

Une faute de frappe, j'ai accidentellement mélangé les deux. – donnyton

1

Selon la grammaire Java, le suffixe f est applicable uniquement à flotter littéraux. Votre deuxième déclaration devrait fonctionner. La première est cependant une expression et nécessite donc un casting:

springing[n] = (float)(.05*(.17*(n+1))); 
1

Dans votre premier exemple, le suffixe f est uniquement valable directement sur les littéraux, pas après une expression entière. Donc, écrire dans l'une de ces façons (en supposant jaillissant est un flotteur []):

springing[n] = .05f*(.17f*(n+1)); 
springing[n] = (float)(.05*(.17*(n+1))); 

Le premier fait le calcul entier (en dehors de la partie n+1) à flotteur, le second calcule à deux, puis convertis seulement le résultat à flotter.

(Et dans les deux cas, la parenthèse entre .05 et .17 (et correspondant à un) est généralement superflue, puisque la multiplication est associative. Il peut faire une différence pour les valeurs vraiment grandes de n, mais dans ce cas, vous feriez habituellement voulez-vous éviter le débordement?)

Questions connexes