From d7500ba2289f33c844782a9e10fb6c6cb3a212e4 Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Sun, 25 Jan 2009 15:44:17 +0000 Subject: fixing / improving printFloat() from Mikal Hart --- cores/arduino/Print.cpp | 49 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/cores/arduino/Print.cpp b/cores/arduino/Print.cpp index 143f15d..d4833da 100755 --- a/cores/arduino/Print.cpp +++ b/cores/arduino/Print.cpp @@ -81,7 +81,7 @@ void Print::print(long n, int base) void Print::print(double n) { - printFloat(n*100, 2); + printFloat(n, 2); } void Print::println(void) @@ -167,20 +167,37 @@ void Print::printNumber(unsigned long n, uint8_t base) 'A' + buf[i - 1] - 10)); } -void Print::printFloat(double number, uint8_t scale) +void Print::printFloat(double number, uint8_t digits) { - double mult = pow(10,scale); - double rounded = floor(number /mult); - double biground = rounded * mult; - double remainder = (number - biground); - remainder = remainder / mult; - print(long(rounded)); - print("."); - - while (scale--) { - double toPrint = floor(remainder * 10); - print(int(toPrint)); - remainder -= (toPrint/10); - remainder *= 10; + // Handle negative numbers + if (number < 0.0) + { + print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (uint8_t i=0; i 0) + print("."); + + // Extract digits from the remainder one at a time + while (digits-- > 0) + { + remainder *= 10.0; + int toPrint = int(remainder); + print(toPrint); + remainder -= toPrint; } -} \ No newline at end of file +} -- cgit v1.2.3-18-g5258