Float rounding to 2 decimal places after SPIFFs save/load

Hi - I have a float variable that I’d like to keep to 3 decimal places, but I’ve noticed that when I save it to a text file with SPIFFs and load it again, it only has the first 2 decimal places.

I will paste the relevant sequence here:

the variable in question:

float gauge = 0;

the spiffs write function (fills 11 lines of a text file, the float variable is line 6):

void writeFile() {
String fileLoader1 = String(loadChoice);
String fileLoader2 = String ( "/save" + fileLoader1 +  ".txt");
  File f = SPIFFS.open(fileLoader2, "w");
  if (!f) {
      Serial.println("file open failed");
  }
  Serial.println("=======Save File=======");
  
  for (int i=1; i<12; i++){
    if (i == 1) {
      f.print(fileWriteDel);
      f.print(",");
      f.print(loadChoice);
      f.print('\n');
    };
    
    if (i == 2) {
      f.print(pickupName);
      f.print('\n');
    };
    
    if (i == 3) {
      f.print(RPMs);
      f.print('\n');
    };
    
    if (i == 4) {
      f.print(bobbinPlate);
      f.print('\n');
    };
    
    if (i == 5) {
      f.print(bobbinSpace);
      f.print('\n');
    };
    
    if (i == 6) {
      f.print(gauge);
      f.print('\n');
    };
    
    if (i == 7) {
      if (dirCW == true) {
        f.print("true");
        f.print('\n');
        } else {
        f.print("false");
        f.print('\n');
        };
    };
    
    
    if (i == 8) {
      for (int i = 0; i < 20; i ++) {
        f.print(blockNum[i]);
        f.print(",");
      };
      f.print('\n');
    };
    
    if (i == 9) {
      for (int i = 0; i < 20; i ++) {
        f.print(blockArea[i]);
        f.print(",");
      };
      f.print('\n');
    };
    
    if (i == 10) {
      for (int i = 0; i < 20; i ++) {
        f.print(blockStrafe[i]);
        f.print(",");
      };
      f.print('\n');
    };
    
    if (i == 11) {
        for (int i = 0; i < 20; i ++) {
        f.print(blockWinds[i]);
        f.print(",");
      };
      f.print('\n');
    };

  };
  f.close();
};

And here’s the SPIFFs load function - the lines are strings when initially parsed, so .toFloat is used on the string. I’m not sure if it’s losing the third decimal on save or load.

void loadFile() {
String fileLoader1 = String(loadChoice);
String fileLoader2 = String ( "/save" + fileLoader1 +  ".txt") ;
  File f = SPIFFS.open(fileLoader2, "r");
  if (!f) {
      Serial.println("file open failed");
  }  Serial.println("=======Load Save=======");

  for (int i=1; i<12; i++){
    String s=f.readStringUntil('\n');


if (i==1) {
    Serial.println("saveStat / saveBlock");
s.toCharArray(c,200);
    int result = sscanf(c, "%i,%i", &saveStat, &saveBlock);
  Serial.println(saveStat);
  Serial.println(saveBlock);
    }; // line 1 saveStat / saveBlock
    
if (i==2) {
    Serial.println("PICKUP NAME");
  pickupName = s;
  Serial.println(pickupName);
    }; // line 2 PICKUP NAME

if (i==3) {
    Serial.println("RPMs");
  RPMs = s.toInt();
  Serial.println(RPMs);
    }; // line 3 RPMs

if (i==4) {
    Serial.println("bobbinPlate");
  bobbinPlate = s.toFloat();
  Serial.println(bobbinPlate);
    }; // line 4 bobbinPlate

if (i==5) {
    Serial.println("bobbinSpace");
  bobbinSpace = s.toFloat();
  Serial.println(bobbinSpace);
    }; // line 5 bobbinSpace

if (i==6) {
    Serial.println("gauge");
  gauge = s.toFloat();
  Serial.println(gauge);
    }; // line 6 gauge

if (i==7) {
    Serial.println("dirCW");
    if (s >= "true") {
      dirCW = true;
      Serial.println("true");
      } else {
        dirCW = false;
        Serial.println("false");
        }
        Serial.println(s);
    }; // line 7 dirCW
    
    if (i==8) {
    Serial.println("BLOCK NUMBERS");
    s.toCharArray(c,200);
    int result = sscanf(c, "%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i", &blockNum[0], &blockNum[1] ,&blockNum[2], &blockNum[3], &blockNum[4], &blockNum[5], &blockNum[6] ,&blockNum[7], &blockNum[8], &blockNum[9], &blockNum[10], &blockNum[11] ,&blockNum[12], &blockNum[13], &blockNum[14], &blockNum[15], &blockNum[16] ,&blockNum[17], &blockNum[18], &blockNum[19]);
        for (int i=0; i<20; i++){
        Serial.print(blockNum[i]);
        Serial.print(",");
        }
    }; // line 8 BLOCK NUMBERS

    if (i==9) {
      Serial.println("");
    Serial.println("BLOCK AREA");
    s.toCharArray(c,200);
    int result = sscanf(c, "%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i", &blockArea[0], &blockArea[1] ,&blockArea[2], &blockArea[3], &blockArea[4], &blockArea[5], &blockArea[6] ,&blockArea[7], &blockArea[8], &blockArea[9], &blockArea[10], &blockArea[11] ,&blockArea[12], &blockArea[13], &blockArea[14], &blockArea[15], &blockArea[16] ,&blockArea[17], &blockArea[18], &blockArea[19]);
        for (int i=0; i<20; i++){
        Serial.print(blockArea[i]);
        Serial.print(",");
        }
    }; // line 9 blockArea

    if (i==10) {
      Serial.println("");
    Serial.println("BLOCK STRAFE");
    s.toCharArray(c,200);
    int result = sscanf(c, "%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i", &blockStrafe[0], &blockStrafe[1] ,&blockStrafe[2], &blockStrafe[3], &blockStrafe[4], &blockStrafe[5], &blockStrafe[6] ,&blockStrafe[7], &blockStrafe[8], &blockStrafe[9], &blockStrafe[10], &blockStrafe[11] ,&blockStrafe[12], &blockStrafe[13], &blockStrafe[14], &blockStrafe[15], &blockStrafe[16] ,&blockStrafe[17], &blockStrafe[18], &blockStrafe[19]);
        for (int i=0; i<20; i++){
        Serial.print(blockStrafe[i]);
        Serial.print(",");
        }
    }; // line 10 blockStrafe

    if (i==11) {
      Serial.println("");
    Serial.println("BLOCK WINDS");
    s.toCharArray(c,200);
    int result = sscanf(c, "%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i", &blockWinds[0], &blockWinds[1] ,&blockWinds[2], &blockWinds[3], &blockWinds[4], &blockWinds[5], &blockWinds[6] ,&blockWinds[7], &blockWinds[8], &blockWinds[9], &blockWinds[10], &blockWinds[11] ,&blockWinds[12], &blockWinds[13], &blockWinds[14], &blockWinds[15], &blockWinds[16] ,&blockWinds[17], &blockWinds[18], &blockWinds[19]);
        for (int i=0; i<20; i++){
        Serial.print(blockWinds[i]);
        Serial.print(",");
        }
    }; // line 11 blockWinds
    
  }
  f.close();
  blockCounter();
}

Any thoughts would be helpful!

 print(float value, byte precision=2);

.print(1.23456);    gives 1.23
.print(1.23456, 4); gives 1.2345
...

You don’t give a second argument in your print, so you will get the standard two digits.

1 Like

That worked, thanks!