Задача C Проблема с округлением поплавка - PullRequest
3 голосов
/ 13 июня 2011

У меня проблема с округлением результата вычисления до двух знаков после запятой.

Это финансовый расчет, и когда результат включает половину копейки, я ожидаю, что число будет округлено в большую сторону, но на самом деле оно округляется в меньшую сторону.

Чтобы повторить проблему:

float raw = 16.695;
NSLog(@"All DP: %f",raw);
NSLog(@"2 DP: %.2f",raw);

Возвращает:

All DP: 16.695000
2 DP: 16.69

В то время как я ожидал бы увидеть:

All DP: 16.695000
2 DP: 16.70

Может кто-нибудь посоветовать, если это умышленно или (скорее всего) я что-то упустил и могу ли я что-то сделать, чтобы обойти это. Жизненно важно, чтобы это округлилось в этом сценарии.

Заранее спасибо, Oli

Ответы [ 4 ]

8 голосов
/ 13 июня 2011

Не используйте float s для финансовых расчетов!

Есть значения с плавающей точкой не могут точно представлять .16.695 является одним из них.Когда вы пытаетесь сохранить это значение в формате с плавающей запятой, вы фактически получаете ближайшее представимое значение.Когда вы выполняете серию операций с плавающей точкой, вы можете потерять точность , а затем вы потеряете точность.Это приводит к потере денег.

Используйте фактический тип валюты, используйте NSDecimalNumber или выполняйте все свои вычисления с int s, которые подсчитывают наименьшую единицу, которая вас интересует (т.е. 1050 составляет 10,50 долл. США в целых центах или 1,050 долл. США, если вы хотите получить доли копейки).

3 голосов
/ 13 июня 2011

Насколько мне известно, функция NSLog() принимает только аргументы форматирования и не пытается округлить.

Вы можете использовать функцию стиля printf(), которая поддерживает округление.

Я предлагаю использовать одну из многих функций в math.h, чтобы округлить ваше значение перед выводом и использовать только NSLog() для форматирования.

0 голосов
/ 26 апреля 2012

Вы можете попробовать это:

 - (void)testNSlogMethod {

    float value = 16.695; //--16.70
    value = value *100;

    int mulitpler = round(value);

    NSLog(@"%.2f",mulitpler/100.0f);
}
0 голосов
/ 13 июня 2011

После просмотра комментариев

Используйте семейство стандартных функций C round ().roundf () для float, round () для double, и roundl () для long double .Затем вы можете привести результат к целочисленному типу по вашему выбору

...