2015-10-27 1 views
1

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.

+1

Javascript a seulement [un type 'Number'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number). –

+0

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). –

+0

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. –

Répondre

1

Toutes les valeurs numériques en JavaScript sont Number s Ce sont tous des nombres à virgule flottante de 64 bits.

Read more here

+0

Ce n'est pas une réponse. '0.000009999999747378752' peut également être représenté en double de 64 bits, donc la question est comment puis-je obtenir ce nombre quand j'ai' 0.0000100000000000000008180305391403'? –

3

JavaScript lui-même ne fournit pas une telle fonction. Je vous recommande d'utiliser big.js si vous avez absolument besoin de conversions de précision.

1

Cela va convertir un certain nombre de flotter en javascript:

new Float32Array([15.603179021718429])[0] 

La réponse est:

15.603178977966309 

Oops, encore plus facile, utilisez Math.fround(). Nouveau dans ES6.