2012-10-17 4 views
6

Ich habe einige Inkonsistenzen zwischen Python und JavaScript beim Konvertieren einer Zeichenfolge in base36 festgestellt.Konvertieren von Zeichenfolge in Base36 Inkonsistenzen zwischen Sprachen.

Python-Methode:

>>> print int('abcdefghijr', 36) 

Ergebnis: 37713647386641447

Javascript-Methode:

<script> 
    document.write(parseInt("abcdefghijr", 36)); 
</script> 

Ergebnis: 37713647386641450

Was verursacht die unterschiedlichen Ergebnisse zwischen den beiden Sprachen? Was wäre der beste Ansatz, um unabhängig von der Sprache die gleichen Ergebnisse zu erzielen?

Vielen Dank.

+4

Siehe http://stackoverflow.com/questions/5812096/javascript-large-integer-round-because-precision-why; Javascript hat keine willkürliche Genauigkeit wie zB Python. (Geben Sie einfach '37713647386641447' in die JavaScript-Konsole ein, erhalten Sie den gleichen gerundeten Wert) – geoffspear

Antwort

10

Diese Zahl benötigt 56 Bits zur Darstellung. JavaScript-Nummern sind eigentlich double-precision binary floating point numbers oder double für kurz. Diese sind insgesamt 64 Bit und können einen viel breiteren Bereich von Werten als 64-Bit-Ganzzahlen darstellen, aber aufgrund dessen, wie sie dies erreichen (sie stellen eine Zahl wie mantissa * 2^exponent dar), können sie nicht alle Zahlen in diesem Bereich darstellen , nur diejenigen, die ein Vielfaches von 2^exponent sind, wo das Vielfache in die Mantisse passt (was 2^0 = 1 einschließt, so erhalten Sie alle ganze Zahlen, die die Mantisse direkt verarbeiten kann). Die Mantisse beträgt 53 Bit, was für diese Zahl nicht ausreicht. So wird es auf eine Zahl gerundet, die darstellen kann.

Sie können einen willkürlichen Präzisionsnummerntyp verwenden, der von einer Drittanbieterbibliothek wie gwt-math oder Big.js definiert wird. Diese Zahlen sind nicht schwer zu implementieren, wenn Sie Ihre Schularithmetik kennen. Effizientes Handeln ist eine andere Sache, aber auch ein Gebiet, in dem umfangreiche Forschung betrieben wird. Und nicht Ihr Problem, wenn Sie eine vorhandene Bibliothek verwenden.

+0

Tolle Erklärung. Vielen Dank. –

Verwandte Themen