Усечение двойного без округления в C

Давайте рассмотрим, что мы имеем double R = 99.999999; (что может быть получено результатом какого-либо другого вычисления), теперь желаемый результат 99.99

Я пробовал использовать printf("%.2lf",R);, но он округлял значение. Как получить желаемый результат? (предпочтительно используя printf)

Ответ 1

#include <math.h>
...
    printf("%.2f", floor(100 * R) / 100);

Ответ 2

Все, что вам нужно сделать, это вычесть .005 из числа, и волшебный printf будет вести себя как угодно: всегда округлять вниз.

Ответ 3

sprintf в буфер, а затем поместите NUL char через два байта через.

Затем printf ваша окончательная строка с использованием промежуточной.

Ответ 4

Если у вас есть это, используйте fmod(), чтобы отрубить хвост double:

double rounded = R - fmod(R, 0.01);
// Now just print rounded with what you were using before

Это имеет то преимущество, что работает то же самое, если R является положительным или отрицательным.

Ответ 5

Можете ли вы умножить на 100, а затем усечь на целое число? Затем вы можете отформатировать результат, как и доллары и цента. Простое разделение на 100 может вернуть вас обратно в квадрат из-за проблем с плавающей точкой.

Ответ 6

Как насчет использования double trunc(double) от GLibC?

Ответ 7

Другое решение, используя приведения:

...
printf("%.2lf", (double) ((int) (R * 100)) / 100);

Ответ 8

Еще один способ, поистине, означать агностик: printf ( "% d.% d\n", (int) r, abs ((int) (r * 100)% 100));