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

#c #type-conversion

#c #преобразование типа

Вопрос:

В настоящее время я сталкиваюсь со странным случаем: у меня двойное значение с одним десятичным числом, т.е. 24.9

из этого значения я хочу получить всю часть, т.е.. целое = 24 и, кроме того, десятичная часть в виде: decimal = 9

для этого я действую следующим образом

 double temp_double = 24.9;
double entire;
double decimal = modf(temp_double, amp;entire)*10;
 

что дает :

 >printf("entire part = %fn", entire);
>printf("decimal part = %fn", decimal);

entire part = 24.000000
decimal part = 9.000000
 

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

 entire = (int)entire;
decimal = (int)decimal;
 

и затем, если я его напечатаю, это даст мне :

 entire part = 24
decimal part = 8  ==> erroneous value
 

с 24.7 я сталкиваюсь с аналогичной проблемой (получаю 6 вместо 7).

Я знаю, что это проблема с округлением, и я хотел бы знать, могу ли я каким-либо образом улучшить свой код, чтобы смягчить эти проблемы. Я имею в виду, есть ли какие-либо дополнительные вычисления (используйте другой масштаб, другую базу, что угодно …), Которые я мог бы применить, чтобы, наконец, получить правильное значение для десятичной части?

в противном случае многие значения могут отображаться неправильно

любая помощь приветствуется … 🙁

Комментарии:

1. Используйте round() функцию: en.cppreference.com/w/c/numeric/math/round

2. Как бы вы справились с вводом 24.86 ? Если это неверно, и у вас есть только входные данные с точностью до одного знака после запятой, вы не должны использовать числа с плавающей запятой — вы должны использовать что-то вроде int , но масштабировать в 10 раз.

3. ну, на самом деле это то, что я понял, и я так и сделаю… Я делил для удобства, пока не столкнулся с проблемой, но я могу справиться с коэффициентом 10. Спасибо 🙂

Ответ №1:

Ну, наконец, я буду использовать десятикратный коэффициент, так как с ним будет легко справиться в дальнейших обработках. Я должен был быстрее читать комментарии, это сэкономило бы мне некоторое время. Спасибо @AndrewHenle и @AdrianMole за вашу помощь

Комментарии:

1. серьезный вопрос, почему вы не используете функцию round() ? В качестве проблемы? Или просто потому, что вы не хотите его использовать?

2. Ну, изначально мои данные — это данные о температуре, которые я извлекаю из кадра, и они выражаются в десятых градусах. Я предпочитаю использовать коэффициент 10, поскольку он справедлив… ничего не делать. В то время, когда мне действительно нужно использовать десятичное значение, я просто делаю «значение», чтобы получить десятичную часть.