2017-11-23 4 views
0

ich richtig bin versucht zu konvertieren (Parsing) eine Zeichenfolge in Java zu schweben, denn die Zahl 5755,1115, Beispiel:Zeichenfolge konvertieren zu schweben - java vs Javascript

float fl = new BigDecimal("5755.1115").floatValue(); 
float fl = (float)5755.1115d; 

Das Problem ist, dass es immer 5755,1113 druckt. Es scheint, es verliert Präzision (Ich habe auch versucht MathcContext (10) zum Beispiel verwenden, aber hat nicht funktioniert)

Aber wenn ich versuche, das in JavaScript scheint es funktioniert:

var fl = parseFloat('5755.1115'); 
var str = "" + fl.toPrecision(8); 
console.log("number: " + str); 

Sie gibt die Anzahl korrekt, auch wenn ich die Funktion toPrecision() nicht verwende.

Kann mir jemand erklären, wie ich das auch in Java erreichen kann?

EDIT: Mein Fehler, ich habe vergessen anzugeben, dass ich nicht doppelt verwenden möchte, weil ich die Datenübertragung auf Minimum halten muss.

+1

Warum vergleichen Sie Java und JavaScript? – Paul

+1

Scheint ziemlich offensichtlich, dass '5755.1113' der nächste' float' zu '5755.1115' ist. Sie können stattdessen ein "Doppel" verwenden, wenn es nicht präzise genug ist. – khelwood

+0

Ich denke, es ist weil JavaScript nur doppelt und 5755.1115 hat zu viel Präzision für einen Float. – neuhaus

Antwort

3

JavaScript kann nur Doubles. Der Aufruf von toPrecision (8) auf einem JavaScript-Double ändert das nicht.

[Nicht nur in Java,] ein Float ist nicht groß genug, um 5755.1115 genau zu speichern.

Kann mir jemand erklären, wie ich das auch in Java erreichen kann?

Verwenden Sie ein Doppel anstelle eines Schwimmers, wenn Sie die zusätzliche Präzision benötigen.

+0

Ich habe vergessen anzugeben, dass ich nicht doppelt verwenden möchte, weil ich die Datenübertragung auf Minimum halten muss. (Ich habe meinen Post bearbeitet) –

+1

Ein Float ist nicht groß genug, also muss man den Verlust an Genauigkeit akzeptieren oder etwas anderes verwenden. – neuhaus

2

für die Java-Seite: Das hier

float fl = new BigDecimal("5755.1115").floatValue(); 

ist im Grunde sinnlos . Sie erstellen zuerst ein BigDecimal-Objekt (das beliebige Genauigkeit ermöglicht) - um dann diese genaue Darstellung in einen viel "weniger präzisen" Float-Wert zu verwandeln. Sie könnten auch schreiben

float fl = 5755.1115f; 

stattdessen. Entweder möchten Sie den Overhead für "präzise" BigDecimal ausgeben - oder Sie sind zufrieden mit der gewöhnlichen Java-Fließkomma-Semantik. Aber diese beiden Konzepte zu vermischen, wie Sie es hier tun, ist, wie gesagt, sinnlos.

Verwandte Themen