// printFloat prints out the float 'value' rounded to 'places' places after the decimal point void printFloat(float value, int places) { // this is used to cast digits int digit; float tens = 0.1; int tenscount = 0; int i; float tempfloat = value; // make sure we round properly. this could use pow from , but doesn't seem worth the import // if this rounding step isn't here, the value 54.321 prints as 54.3209 // calculate rounding term d: 0.5/pow(10,places) float d = 0.5; if (value < 0) d *= -1.0; // divide by ten for each decimal place for (i = 0; i < places; i++) d/= 10.0; // this small addition, combined with truncation will round our values properly tempfloat += d; // first get value tens to be the large power of ten less than value // tenscount isn't necessary but it would be useful if you wanted to know after this how many chars the number will take if (value < 0) tempfloat *= -1.0; while ((tens * 10.0) <= tempfloat) { tens *= 10.0; tenscount += 1; } // write out the negative if needed if (value < 0) Serial.print('-'); if (tenscount == 0) Serial.print(0, DEC); for (i=0; i< tenscount; i++) { digit = (int) (tempfloat/tens); Serial.print(digit, DEC); tempfloat = tempfloat - ((float)digit * tens); tens /= 10.0; } // if no places after decimal, stop now and return if (places <= 0) return; // otherwise, write the point and continue on Serial.print('.'); // now write out each decimal place by shifting digits one by one into the ones place and writing the truncated value for (i = 0; i < places; i++) { tempfloat *= 10.0; digit = (int) tempfloat; Serial.print(digit,DEC); // once written, subtract off that digit tempfloat = tempfloat - (float) digit; } } void setup() { Serial.begin(9600); } void loop() { // ========================================== // now run a series on the printFloat function // looking at the precision of the float Serial.println("printFloat(1000000.321 , 5);"); printFloat(1000000.321, 5); Serial.println(); Serial.println("printFloat(100000.321 , 5);"); printFloat(100000.321, 5); Serial.println(); Serial.println("printFloat(10000.321 , 5);"); printFloat(10000.321, 5); Serial.println(); Serial.println("printFloat(1000.321 , 5);"); printFloat(1000.321, 5); Serial.println(); Serial.println("printFloat(100.321 , 5);"); printFloat(100.321, 5); Serial.println(); // ========================================== // looking at effect of changing precision Serial.println("printFloat(100000.321 , 6);"); printFloat(100000.321, 6); Serial.println(); Serial.println("printFloat(100000.321 , 7);"); printFloat(100000.321, 7); Serial.println(); Serial.println("printFloat(100000.321 , 8);"); printFloat(100000.321, 8); Serial.println(); Serial.println("printFloat(100000.321 , 9);"); printFloat(100000.321, 9); Serial.println(); // ========================================== // check negatives and rounding, and some edge cases Serial.println("printFloat(-5004.321 , 5);"); printFloat(-5004.321 , 5); Serial.println(); Serial.println("printFloat(99.999 , 3); "); printFloat(99.999 , 3); Serial.println(); Serial.println("printFloat(100, 1);"); printFloat(100, 1); Serial.println(); Serial.println("printFloat(-100.999 , 1);"); printFloat(-100.999 , 1); Serial.println(); Serial.println("printFloat(-54.321 , 0);"); printFloat(-54.321 , 0); Serial.println(); Serial.println("printFloat(0.321 , 5);"); printFloat(0.321 , 5); Serial.println(); Serial.println("printFloat(-1.0001 , 5);"); printFloat(-1.0001 , 5); Serial.println(); Serial.println("printFloat(-0.000001 , 5);"); printFloat(-0.000001 , 5); Serial.println(); Serial.println("printFloat(0.000001 , 5);"); printFloat(0.000001 , 5); Serial.println(); Serial.println("printFloat(-0.00001 , 5);"); printFloat(-0.00001 , 5); Serial.println(); Serial.println("printFloat(0.000099 , 5);"); printFloat(0.000099 , 5); Serial.println(); // alternative technique that depends on //Serial.println("Serial.println(dtostrf(-1.0001, 2, 5, s));"); //char s[32]; // Serial.println(dtostrf(-1.0001, 2, 5, s)); delay(1000); Serial.println(); }