2013-07-28 4 views
0

Я сделал функцию датчика температуры, которая возвращает число с поплавком с 6-значным номером после. (Например: 28,500000)Поплавковая точность C - параметр прохождения в Xively

Использование:

float fTemp; 
... 
printf("Temp = %.1f", fTemp); 

можно ограничить температуру десятичной к одному, и все в порядке. (Например, 28,5)

Теперь я хотел бы передать Тампере на мой счет Xively и у меня есть эта функция:

extern xi_datapoint_t* xi_set_value_f32(xi_datapoint_t* dp, float v); 

Как преобразовать значение с плавающей точкой температуры до одного десятичного знака и передать его в xi_set_value_f32 ?

Спасибо, дк

+0

Из-за природы числа с плавающей запятой, которое невозможно сделать, и не только это, это совершенно бессмысленно. – fvu

+0

Невозможно, потому что плавающие указатели не являются точными (что означает, что для определенных значений деление может заканчиваться очень близко к ожидаемому результату, но не указывать на - например, 16.0/10.0 может дать 1.5999999 в результате) и бессмысленно, так как это проблема отображения ** **, которые должны быть решены во время отображения, а не во время хранения. – fvu

ответ

2

ли это

int tempNumber; 

tempNumber = fTemp*10; 

Now do this 

fTemp = (float)(tempNumber/10.0); 

То, что я сделал здесь, умножив число с плавающей 10 и сохранить в целое, таким образом, я сохранил первое десятичное число ваших с плавающей запятой в целое число, и поэтому все значения после точки пренебрегают.

Далее, что я сделал это, чтобы разделить временное число на 10,0 типаж результата и сохранить обратно в fTemp переменной

+1

Вы можете использовать 'round' для округления до ближайшего. – ouah

+0

@ouah да, это еще лучше :) –

+2

Часто будет работать так, как предполагалось, но не всегда из-за того, как работает fp, пожалуйста, прочитайте [Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://docs.oracle. ком/кд/E19957-01/806-3568/ncg_goldberg.html). – fvu

1

Standard C функции круглого/roundf в math.h должны это сделать.

#include <math.h>  

// ... 

fTemp = roundf(fTemp * 10.0f)/10.0f; 

Снова, зачем вы хотели бы это сделать? Лучше держать точность и просто округлять ее, когда она выводится.

+0

Благодарим вас за ответ. На самом деле я не могу наглядно отображать только 1 десятичный знак, кажется, что это не в настройках. – d82k

Смежные вопросы