Comment convertir un nombre de précision double en précision simple et retour?Conversion entre précision double et flottante en javascript
Par exemple, je présente en Java/C/C#:
double x = 0.00001;
float f = (float)x; // should be 0.000009999999747378752 not 0.0000100000000000000008180305391403
int n = Math.floor(1001 * f/x); // should be 1000 not 1001.
(ne demandez pas que ce soit une version simplifiée de ce que du code poilu C ressemble et je dois le porter 1. : 1)
Un autre exemple:
double y = Math.floor((double)(float)5.999999876); // should be 6.0
Ce que je l'ai déjà essayé:
var f:float = x; // syntax error
var f = x as float; // syntax error
var f = parseFloat(x); // returns full double-precision (0.0000100000000000000008180305391403)
var f = toFixed(x, ...); // Can't use this as float is not defined by number of decimal places but number of binary places.
J'utilise Rhino (dans le cadre de Java 7), et il devrait également être compatible avec Nashorn (dans le cadre de Java 8). J'ai accès à l'API Java publique entière, si cela aide.
[Modifier] Je l'ai fait quelques expériences plus et il semble que le problème est pas dans la conversion du flotteur, mais dans les opérations de flotteur. J'ai vraiment besoin de la FPU dans mon processeur pour effectuer une seule précision fmul
ici. 1001 * f
ne fonctionne pas si f
contient la version de précision flottante 0.00001
dans un nombre à double précision. La seule façon d'obtenir un résultat exact est si j'effectue une multiplication 32 bits sur 1001f * 0.00001f
et puis obtenir le résultat.
Javascript a seulement [un type 'Number'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number). –
Je sais qu'il a un type 'Number', mais vous avez toujours des fonctions comme' floor() 'qui * effectivement * en fait un int (mais pas vraiment). –
Vous avez vraiment besoin de clarifier s'il s'agit de Java ou Javascript ... vous semblez utiliser les deux termes de façon interchangeable, mais ils ne sont pas la même chose. –