Вы можете попытаться вычесть (или добавить для отрицательного числа) небольшую дельту, которая не окажет влияния на округление для чисел, достаточно далеко от точности.
Например, если вы округляете с %.2f
, попробуйте эту версию для Windows:
printf("%.2f", 11.545 - 0.001);
Числа с плавающей точкой общеизвестно проблематичны, если вы не знаете, что происходит под прикрытием. В этом случае вам лучше всего написать (или использовать) библиотеку десятичных типов для облегчения проблем.
Пример программы:
#include <stdio.h>
int main (void) {
printf("%.20f\n", 11.545);
printf("%.2f\n", 11.545);
printf("%.2f\n", 11.545 + 0.001);
return 0;
}
выводит это в моей среде Cygwin:
11.54499999999999992895
11.54
11.55
, который подходит для вашего конкретного случая (он идет неверным путем, но, надеюсь, следует применить и в другом направлении: вам нужно проверить его), но вы должны проверить весь возможный входной диапазон, если хотите быть уверенным, что это будет работать для всех ваших дел.
Обновление:
Евгений, на основании вашего комментария:
Это работает для этого конкретного случая, но не как общее решение. Например, если число, которое я хочу отформатировать, равно 0,545 вместо 11,545, то «% .2f»% (0,545 - 0,001) возвращает «0,54», в то время как «% .2f»% 0,545 в Linux правильно возвращает «0,55».
именно поэтому я сказал, что вам нужно проверить весь диапазон, чтобы увидеть, будет ли он работать, и поэтому я заявил, что предпочтительнее использовать десятичный тип данных.
Если вам нужна десятичная точность, это то, что вам нужно сделать. Но вы, возможно, захотите рассмотреть случаи в этом диапазоне, где Linux тоже идет другим путем (согласно вашему комментарию) - может быть ситуация, когда Linux и Windows расходятся во мнениях в направлении, противоположном тому, что вы нашли - десятичный тип, вероятно, выиграл не решить это.
Возможно, вам придется сделать ваши инструменты сравнения немного более интеллектуальными, поскольку они могут игнорировать разницу в 1 в конечном дробном месте.