2016-04-12 6 views
2

Ich muss einige doppelte Werte auf vier Dezimalstellen runden und dann über XML-RPC mit this library senden.Runden Sie ein Doppel und senden Sie es über XML-RPC

Was ich bisher getan habe ist folgendes:

Zunächst einmal habe ich eine Runde Funktion:

double roundD(double x, unsigned int precision = 4) 
{ 
    return round(x * pow(10.0, double(precision)))/pow(10.0, double(precision)); 
} 

und es funktioniert gut, nach this.

In meiner Anwendung habe ich eine Set-Methode setXValue, die einen Doppel- und ein toXmlRpc() -Methode zur Ausgabe einer XmlRpcValue Aufgabe übernimmt:

class Point{ 
public: 
    Point(double x, double y) {m_x = x; m_y=y;} 

    void Point::setXValue(double x) 
    { 
     m_x = roundD(x); 
    } 

    XmlRpcValue Point::toXmlRpc() const 
    { 
     XmlRpcValue xmlrpcvalue; 
     xmlrpcvalue["x"] = m_x; 
     return xmlrpcvalue; 
    } 

private: 
    double m_x; 
    double m_y; 

Was ich speichere in dem XML-RPC Wert wird keine abgerundetes Doppel. In der Tat, wenn ich diese XML-RPC-Antwort erhalte, sehe ich gute Werte wie 0.3488, 0.1154 zum Beispiel, aber auch Werte in Form von 9.059900000000001 oder 8.990399999999999.

Ich bin sicher, meine RoundD-Funktion funktioniert gut (ich habe es in C++ Spielplatz getestet) also wo das Problem liegt?

ich den Wert in dem XmlRpcValue Objekt wie diese nicht speichern kann:

char str[80]; 
sprintf(str, "%.4f", m_x); 
xmlrpcvalue["x"] = str; 

Ansonsten würde ich den XML-RPC-Datentyp ändern, und das ist nicht richtig.

Antwort

1

Versuchen Sie, diese Memberfunktion von XmlRpcValue mit:

setDoubleFormat (const char *f) 
//Specify the format used to write double values. 
+0

Ah, interessant, ich habe noch nie gesehen. Ich nehme an, ich sollte es so aufrufen: setDoubleFormat ("%. 4f"), richtig? – ABCplus

+0

Ja, das Format ist dasselbe wie sprintf: http://www.cplusplus.com/reference/cstdio/snprintf/ Sehen Sie sich die Verwendung in der Dokumentation an: http://www.oversim.org/chrome/site/doc /doxy/classXmlRpc_1_1XmlRpcValue.html#ade0d89d285db29286e1f4c336ded5cb4 – Rama

+0

Da ich diese Änderung jetzt implementieren werde, denken Sie, dass der Aufruf von 'roundD' in der' setXValue' Funktion immer noch gültig oder völlig unbrauchbar ist? – ABCplus