@cryptotaxi247 / netdata-1 / commits / f5520355f

fix number printing, rounding bug

Costa Tsaousis (ktsaou) committed Jan 18, 2018 at 22:56 UTC f5520355f09ba65cf3693b6b426f0538041f5f7c
1 file changed +15 -4
src/storage_number.c
+15 -4
@@ -162,6 +162,7 @@ int print_calculated_number(char *str, calculated_number value)
162 */
163
164 int print_calculated_number(char *str, calculated_number value) {
165 + // info("printing number " CALCULATED_NUMBER_FORMAT, value);
166 char integral_str[50], fractional_str[50];
167
168 char *wstr = str;
@@ -179,25 +180,34 @@ int print_calculated_number(char *str, calculated_number value) {
180 fractional = ((unsigned long long)(value * 10000000ULL) % 10000000ULL);
181 #endif
182
183 + unsigned long long integral_int = (unsigned long long)integral;
184 + unsigned long long fractional_int = (unsigned long long)calculated_number_llrint(fractional);
185 + if(unlikely(fractional_int >= 10000000)) {
186 + integral_int += 1;
187 + fractional_int -= 10000000;
188 + }
189 +
190 + // info("integral " CALCULATED_NUMBER_FORMAT " (%llu), fractional " CALCULATED_NUMBER_FORMAT " (%llu)", integral, integral_int, fractional, fractional_int);
191 +
192 char *istre;
183 - if(integral == 0.0) {
193 + if(unlikely(integral_int == 0)) {
194 integral_str[0] = '0';
195 istre = &integral_str[1];
196 }
197 else
198 // convert the integral part to string (reversed)
189 - istre = print_number_llu_r_smart(integral_str, (unsigned long long)integral);
199 + istre = print_number_llu_r_smart(integral_str, integral_int);
200
201 // copy reversed the integral string
202 istre--;
203 while( istre >= integral_str ) *wstr++ = *istre--;
204
195 - if(fractional != 0.0) {
205 + if(likely(fractional_int != 0)) {
206 // add a dot
207 *wstr++ = '.';
208
209 // convert the fractional part to string (reversed)
200 - char *fstre = print_number_llu_r_smart(fractional_str, (unsigned long long)calculated_number_llrint(fractional));
210 + char *fstre = print_number_llu_r_smart(fractional_str, fractional_int);
211
212 // prepend zeros to reach 7 digits length
213 int decimal = 7;
@@ -216,5 +226,6 @@ int print_calculated_number(char *str, calculated_number value) {
226 }
227
228 *wstr = '\0';
229 + // info("printed number '%s'", str);
230 return (int)(wstr - str);
231 }