Double decimals not preserved when writing to oled screen

I need to display all digits of longitude, but my oled screen is only displaying 2 decimals

I am using a htcc-AB02S Heltec

longitude is part of a scruct

struct recieveData{
  double  latitude;
  double  longitude;
  double altitudeM;
  double signalQuality;
  int locationAge;
  double speedKmph;
  double courseDeg; 
  int satellitesConnected;
  int gps_year;
  int gps_day;
  int gps_month; 
  int gps_hour;
  int gps_minute;
  int gps_second;
  int gps_centisecond;
  bool valid;  
};
recieveData rGpsData;

and it stores a value -117.706266, but when I try to draw it on my oled screen display, it only shows two decimals. How do I print all of it?

lineString = "R long " + String(double(rGpsData.longitude));

full Reciever code (just the part about displaying is nessisary, the rest I know works and I know I'm getting values into long):

/*
  parse data coming in and assign it to rdata stuffs on every recieve cycle.
*/

#include "Arduino.h"
#include <Wire.h>

#include "LoRaWan_APP.h"
#include "GPS_Air530.h"
#include "HT_SSD1306Wire.h"

SSD1306Wire  screen(0x3c, 500000, SDA, SCL, GEOMETRY_128_64, GPIO10 ); // addr , freq , i2c group , resolution , rst

Air530Class Gps;

#ifndef LoraWan_RGB
#define LoraWan_RGB 0
#endif

#define RF_FREQUENCY                                915000000 // Hz

#define TX_OUTPUT_POWER                             14        // dBm

#define LORA_BANDWIDTH                              0         // [0: 125 kHz,
                                                              //  1: 250 kHz,
                                                              //  2: 500 kHz,
                                                              //  3: Reserved]
#define LORA_SPREADING_FACTOR                       7         // [SF7..SF12]
#define LORA_CODINGRATE                             1         // [1: 4/5,
                                                              //  2: 4/6,
                                                              //  3: 4/7,
                                                              //  4: 4/8]
#define LORA_PREAMBLE_LENGTH                        8         // Same for Tx and Rx
#define LORA_SYMBOL_TIMEOUT                         0         // Symbols
#define LORA_FIX_LENGTH_PAYLOAD_ON                  false
#define LORA_IQ_INVERSION_ON                        false


#define RX_TIMEOUT_VALUE                            1000
#define BUFFER_SIZE                                 50 // Define the payload size here

char txpacket[BUFFER_SIZE];
char rxpacket[BUFFER_SIZE];

static RadioEvents_t RadioEvents;

int16_t txNumber;

int16_t rssi,rxSize;

struct recieveData{
  double  latitude;
  double  longitude;
  double altitudeM;
  double signalQuality;
  int locationAge;
  double speedKmph;
  double courseDeg; 
  int satellitesConnected;
  int gps_year;
  int gps_day;
  int gps_month; 
  int gps_hour;
  int gps_minute;
  int gps_second;
  int gps_centisecond;
  bool valid;  
  
  //year, day, month, hour, minute, second, centisecond, lat, lng, alt.meters, sats, hdop (quality), age, coursedeg, speedkmph    
};
recieveData rGpsData;

struct selfData{
  double  latitude;
  double  longitude;
  double altitudeM;
  double signalQuality;
  int locationAge;
  double speedKmph;
  double courseDeg; 
  int satellitesConnected;
  int gps_year;
  int gps_day;
  int gps_month; 
  int gps_hour;
  int gps_minute;
  int gps_second;
  int gps_centisecond;
  bool valid;  
};
selfData sGpsData;

uint32_t gpsTimer = 0;
uint32_t displayInformationTimer = 0;

int timer1000 = 1000;

void VextON(void){
  pinMode(Vext,OUTPUT);
  digitalWrite(Vext, LOW);
}

void VextOFF(void) {//Vext default OFF
  pinMode(Vext,OUTPUT);
  digitalWrite(Vext, HIGH);
}


void displayInformation();

void setup() {
    Serial.begin(115200);
    VextON();
    
    Gps.begin(9600);
    Gps.setmode(MODE_GPS);

    rssi=0;
	
	  RadioEvents.RxDone = OnRxDone;
    Radio.Init( &RadioEvents );
    Radio.SetChannel( RF_FREQUENCY );
	
	Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
                                   LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
                                   LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
                                   0, true, 0, 0, LORA_IQ_INVERSION_ON, true );
   
  screen.init();
  screen.clear();
  screen.display(); 
  screen.setTextAlignment(TEXT_ALIGN_CENTER);
  screen.setFont(ArialMT_Plain_10);
  screen.drawString(screen.width()/2,screen.height()/2,"gps comms 2 RX");
  screen.display(); 
  delay(1000);
  screen.clear();
  Serial.println("into RX mode");

  }

void loop(){
	Radio.Rx( 0 );
  delay(500);
  Radio.IrqProcess( );
  displayInformation();
}

void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ){
    rssi=rssi;
    rxSize=size;
    memcpy(rxpacket, payload, size );
    rxpacket[size]='\0';
    //turnOnRGB(COLOR_RECEIVED,0);
    Radio.Sleep( );
    parseMessage(rxpacket,rxSize, rssi);  
}

void parseMessage(char rxPacket[], int16_t rxSize, int16_t rssi){
  Serial.printf("\r\nreceived packet \"%s\" with rssi %d , length %d\r\n",rxPacket,rssi,rxSize);
  int numCommas = 0;
  String tempMessage;
  String val;
  for(int i = 0; i <= rxSize; i++){
    val = String(rxPacket[i]);
    
    if(val == ","){
      switch(numCommas){
        case 0: 
          //int hour
          rGpsData.gps_hour = tempMessage.toInt();
          //Serial.print("CnC: "); Serial.print(numCommas);
          //Serial.print("C  tM: "); Serial.println(tempMessage);
          break;
        case 1:
          //int minute
          rGpsData.gps_minute = tempMessage.toInt();
          //Serial.print("CnC: "); Serial.print(numCommas);
          //Serial.print("C tM: "); Serial.println(tempMessage);
          break;
        case 2:
          //int second
          rGpsData.gps_second = tempMessage.toInt();
          //Serial.print("CnC: "); Serial.print(numCommas);
          //Serial.print("C tM: "); Serial.println(tempMessage);
          break;
        case 3: 
         //int sats
          rGpsData.satellitesConnected = tempMessage.toInt();
          Serial.print("rGpsData.satellitesConnected"); Serial.println(rGpsData.satellitesConnected);
          //Serial.print("CnC: "); Serial.print(numCommas);
          Serial.print("C tM: "); Serial.println(tempMessage);
          break;
        case 4:
          //float lat
          rGpsData.latitude = tempMessage.toDouble();
          Serial.print("rGpsData.latitude"); Serial.println(rGpsData.latitude, 7);
          //Serial.print("CnC: "); Serial.print(numCommas);
          Serial.print("C tM: "); Serial.println(tempMessage);
          break;
        case 5:
          //float long
          rGpsData.longitude = tempMessage.toDouble();
          Serial.print("rGpsData.longitude"); Serial.println(rGpsData.longitude, 7);
          //Serial.print("CnC: "); Serial.print(numCommas);
          Serial.print("C tM: "); Serial.println(tempMessage);
          break;
        case 6:
          //double altitudeM
          rGpsData.altitudeM = tempMessage.toDouble();
          Serial.print("rGpsData.altitude"); Serial.println(rGpsData.altitudeM, 7);
          //Serial.print("CnC: "); Serial.print(numCommas);
          Serial.print(" tM: "); Serial.println(tempMessage);
          break;
        case 7:
          //bool valid
          if(tempMessage == "1"){
            rGpsData.valid = true;
          }
          else if (tempMessage == "0"){
            rGpsData.valid = false;
          }
          //Serial.print("CnC: "); Serial.print(numCommas);
          //Serial.print("C tM: "); Serial.println(tempMessage);
          break;  
        case 8:
          Serial.println("8 commas");
              
          Serial.print("8 nC: "); Serial.print(numCommas);
          Serial.print("8 tM: "); Serial.println(tempMessage);
          break;  
      }
      
      //Serial.print(" == nC: "); Serial.print(numCommas);
      //Serial.print(" == tM: "); Serial.println(tempMessage);
      tempMessage = "";
      numCommas++;
    }
    else if(val == "|"){
      if(rxPacket[i-1] == '1'){
        rGpsData.valid = true;
      }
      else if (rxPacket[i-1] == '0'){
        rGpsData.valid = false;
      }
      Serial.print("Valid: "); Serial.println(rGpsData.valid);
      break;
    }
    else{
      tempMessage += val;
    } 
  }   
}

void displayInformation(){
  if(millis() - displayInformationTimer >= timer1000){
    updateSelfInfo();
    Serial.println("========================");
    
    String lineString;
    screen.clear();
    screen.setFont(ArialMT_Plain_10);
    screen.setTextAlignment(TEXT_ALIGN_LEFT);
  
  //recieved data
    if(rGpsData.valid == true){
      lineString = "R long " + String(double(rGpsData.longitude));// + "  d " + String(rGpsData.gps_day) + "/" + String(rGpsData.gps_month) + "/" + String(rGpsData.gps_year);
      screen.drawString(0, 0,lineString);
      Serial.println(lineString);
  
      lineString = " R lat " + String(double(rGpsData.latitude));// + " alt " + String(rGpsData.altitudeM) + "  t " + String(rGpsData.gps_hour) + ":" + String(rGpsData.gps_minute) + ":" + String(rGpsData.gps_second);
      screen.drawString(0, 16,lineString);
      Serial.println(lineString);
    }
    else if(rGpsData.valid == false){
      screen.setFont(ArialMT_Plain_16);
      screen.setTextAlignment(TEXT_ALIGN_CENTER);
      
      lineString = "Recieved INVALID";
      screen.drawString(0, 0,lineString);
      Serial.println(lineString);
    }
      
  //self data
    if(sGpsData.valid == true){
      lineString = "S long " + String(double(sGpsData.longitude));// + " d " + String(sGpsData.gps_day) + "/" + String(sGpsData.gps_month) + "/" + String(sGpsData.gps_year);
      screen.drawString(0, 32,lineString);
      Serial.println(lineString);
    
      lineString = "lat " + String(double(sGpsData.latitude));// + " alt " + String(sGpsData.altitudeM) + " t " + String(sGpsData.gps_hour) + ":" + String(sGpsData.gps_minute) + ":" + String(sGpsData.gps_second);
      screen.drawString(0, 48,lineString);
      Serial.println(lineString);     
      
    }
    else if(sGpsData.valid == false){
      screen.setFont(ArialMT_Plain_16);
      screen.setTextAlignment(TEXT_ALIGN_CENTER);
      
      lineString = "SELF INVALID";
      screen.drawString(0, 32,lineString);
      Serial.println(lineString);
    }
    screen.display();
    Serial.println("========================");
  }
}

void updateSelfInfo(){
  readGps();
   /*//DEBUG PRINTS FOR LOOP
  Serial.print("day: "); Serial.println(data.gps_day);
  Serial.print("month: ");Serial.println(data.gps_month);
  Serial.print("gps_year: "); Serial.println(data.gps_year);
  Serial.print("hour: "); Serial.println(data.gps_hour);
  Serial.print("gps_minute: "); Serial.println(data.gps_minute);
  Serial.print("gps_second: "); Serial.println(data.gps_second); 
  Serial.print("gps_centisecond: "); Serial.println(data.gps_centisecond);
  Serial.print("latitude: "); Serial.println(data.latitude);
  Serial.print("longitude: "); Serial.println(data.longitude);
  Serial.print("altitudeM: "); Serial.println(data.altitudeM);
  Serial.print("satellites: "); Serial.println(data.satellitesConnected;);
  Serial.print("signalQuality: "); Serial.println(data.signalQuality);
  Serial.print("locationAge: "); Serial.println(data.locationAge);
  Serial.print("courseDeg: "); Serial.println(data.courseDeg);
  Serial.print("speedKmph: "); Serial.println(data.speedKmph);
  Serial.println(">>>>>>>>>>>>>>>>>>....................");
  delay(1000);
  */
  
  if (Gps.date.isValid()){
    sGpsData.valid = true;
    sGpsData.gps_day = Gps.date.day();
    sGpsData.gps_month = Gps.date.month();
    sGpsData.gps_year = Gps.date.year();
  }
  else{
    sGpsData.valid = false;
    Serial.print("INVALID++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
  }
 
  if (Gps.time.isValid()){ 
    sGpsData.valid = true;
    sGpsData.gps_hour = Gps.time.hour();
    sGpsData.gps_minute = Gps.time.minute();
    sGpsData.gps_second = Gps.time.second(); 
    sGpsData.gps_centisecond = Gps.time.centisecond();
  }
  else{
    sGpsData.valid = false;
    Serial.print(" INVALID++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
  }
  sGpsData.latitude = Gps.location.lat();
  sGpsData.longitude = Gps.location.lng();
  sGpsData.altitudeM = Gps.altitude.meters();
  sGpsData.satellitesConnected = Gps.satellites.value();
  sGpsData.signalQuality = Gps.hdop.hdop();
  sGpsData.locationAge = Gps.location.age();
  sGpsData.courseDeg = Gps.course.deg();
  sGpsData.speedKmph = Gps.speed.kmph();
  // debug prints
  Serial.println("self+++++++++++++++++++++++++++++++++"); 
  Serial.print("LAT: ");
  Serial.println(sGpsData.latitude,6);
  Serial.print(", LON: ");
  Serial.println(sGpsData.longitude,6);
  Serial.print(", ALT: ");
  Serial.println(sGpsData.altitudeM);
  Serial.print("SATS: ");
  Serial.println(sGpsData.satellitesConnected);
  Serial.print(", HDOP: ");
  Serial.println(sGpsData.signalQuality);
  Serial.print(", AGE: ");
  Serial.println(sGpsData.locationAge);
  Serial.print(", COURSE: ");
  Serial.println(sGpsData.courseDeg);
  Serial.print(", SPEED: ");
  Serial.println(sGpsData.speedKmph);
  Serial.println("++++++++++++++++++++++++++++++");
  Serial.println("recieved:::::::::::::::::::::::::::::::"); 
  Serial.print("LAT: ");
  Serial.println(rGpsData.latitude,6);
  Serial.print(", LON: ");
  Serial.println(rGpsData.longitude,6);
  Serial.print(", ALT: ");
  Serial.println(rGpsData.altitudeM);
  Serial.print("SATS: ");
  Serial.println(rGpsData.satellitesConnected);
  Serial.print("valid: ");
  Serial.println(rGpsData.valid);
  Serial.println("recieved:::::::::::::::::::::");
}

/*
  double  latitude;
  double  longitude;
  double altitudeM;
  double signalQuality;
  int locationAge;
  double speedKmph;
  double courseDeg; 
  int satellitesConnected;
  int gps_year;
  int gps_day;
  int gps_month; 
  int gps_hour;
  int gps_minute;
  int gps_second;
  int gps_centisecond;
  bool valid;  
*/

void readGps(){
   
  if(millis() - gpsTimer > timer1000){
    while(Gps.available() > 0){

      Gps.encode(Gps.read());
    }
    gpsTimer = millis();
  }  
  
  if (millis() > 5000 && Gps.charsProcessed() < 10)
  {
    
    sGpsData.valid = false;
    Serial.println("No GPS detected: check wiring.");
    while(true);
  }
}

for instance, when I hard coded latitude right before I printed, it still only had two decimals

 Serial.print("rGpsData.latitude"); Serial.println(rGpsData.latitude, 7);

Is it a typo somewhere? Because the first suggestion is often to specify the number of decimal digits, but you have already done that.

yes sorry, in serial it works just fine - I had forgotten to add the 7 there.
The issue is with converting the double to a string. When I do the string(longitude), it shortens. Ie:


rGpsData.longitude = -117.706266;
      String testerString = String(rGpsData.longitude);
      Serial.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!TESTER!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 
      Serial.println(rGpsData.longitude, 8);
      Serial.println(testerString);
      lineString = "R long " + String(rGpsData.longitude);// + "  d " + String(rGpsData.gps_day) + "/" + String(rGpsData.gps_month) + "/" + String(rGpsData.gps_year);
      screen.drawString(0, 0,lineString);
      Serial.println(lineString);

here, longitude has decimals. When I print regular serial, it works with all the decimals. When I print testerString, which is String(longitude), it only has 2

image

is there a way to make a string or some way to print it while keeping all the values?

IDK but try
Serial.println(testerString.toDouble() );
untested

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!TESTER!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-117.70626600 :regular, nothing changed
-117.71 : testerstring
-117.71 : testerstring to double

Seems to me there was a thread on this a few weeks ago. Try a search.

DO NOT CROSS POST. Convert string to double retaining 7 decimals

sorry, I posted here first and then people answered a different question I had in another so I asked them and was going to close this with the solution if they did.

I'll move all the information from here to there.

this is the link to the other forum in case anyone is wondering where the answer is,

thank you jremington for reminding me:) I'm very new here