округление чисел в objective-c

<p>я пытаюсь сделать некоторое округление числа и преобразование в строку, чтобы улучшить вывод в программе objective-c. </p><p>у меня есть значение с плавающей точкой, которое я хотел бы округлить до ближайшего .5, а затем использовать его, чтобы установить текст на этикетке.</p><p>например:</p><p>1.4 будет строка: 1,5</p><p>1.2 будет строка из: 1</p><p>0.2 будет строка: 0</p><p>я некоторое время искал ответ в google, но, будучи новичком в objective-c, я не уверен, что искать! так что, я бы очень оценил указатель в правильном направлении!</p><p>спасибо, ash</p>

<p>спасибо всем за указатели, мне удалось найти решение:</p><pre><code>float roundedvalue = round(2.0f * number) / 2.0f; nsnumberformatter *formatter = [[nsnumberformatter alloc] init]; [formatter setmaximumfractiondigits:1]; [formatter setroundingmode: nsnumberformatterrounddown]; nsstring *numberstring = [formatter stringfromnumber:[nsnumber numberwithfloat:roundedvalue]]; [formatter release]; </code></pre><p>вышеуказанное работает для тестовых случаев, которые я бросил, но если кто-нибудь знает лучший способ сделать это, мне было бы интересно услышать это!</p>

<pre><code>float floatval = 1.23456; </code></pre><p><strong> округление </strong> </p><pre><code>int roundedval = lroundf(floatval); nslog(@"%d",roundedval); </code></pre><p><strong> округления </strong></p><pre><code>int roundedupval = ceil(floatval); nslog(@"%d",roundedupval); </code></pre><p><strong> округление вниз </strong></p><pre><code>int roundeddownval = floor(floatval); nslog(@"%d",roundeddownval); </code></pre>

<pre><code>nsstring *numberstring = [nsstring stringwithformat:@"%f", round(2.0f * number) / 2.0f]; </code></pre>

<p>используйте lroundf (), чтобы округлить число с плавающей точкой до целого числа, а затем преобразовать целое число в строку.</p>

<pre><code>nsstring *numberstring = [nsstring stringwithformat:@"%d",lroundf(number)]; </code></pre>

<p>я бы порекомендовал изучить использование <a href="http://developer.apple.com/documentation/cocoa/conceptual/dataformatting/articles/dfnumberformatting10\_4.html#//apple\_ref/doc/uid/tp40002368">nsnumberformatter</a> .</p>

<p>простой способ:</p><pre><code>float thefloat = 1.23456; int rounded = roundf(thefloat); nslog(@"%d",rounded); int roundedup = ceil(thefloat); nslog(@"%d",roundedup); int roundeddown = floor(thefloat); nslog(@"%d",roundeddown); // note: int can be replaced by float </code></pre>

<p>следующая техника работала для меня в финансовом приложении.</p><pre><code> nsstring *dd=[nsstring stringwithformat:@"%0.2f",monthlypaymentcalculated]; monthlypaymentcalculated=[dd doublevalue]; self.monthlypaymentcritical=monthlypaymentcalculated; </code></pre><p>сначала делается округление его до% 0.2f и его сохранение в nsstring, затем я просто снова конвертирую его в double, и результат оказался хорошим для моих расчетов.</p>

<pre><code>nsstring *intnumberstring = [nsstring stringwithformat:@"%d", (int)floatnumber]; </code></pre>

<p>с помощью этих функций вы можете округлить любое значение. если вы используете p = 2, вы получите четные числа.</p><pre><code>float roundto(float x, float p) { float y = 1/p; return int((x+(1/(y+y)))*y)/y; } float roundup(float x, float p) { float y = 1/p; return int((x+(1/y))*y)/y; } float rounddown(float x, float p) { float y = 1/p; return int(x*y)/y; } </code></pre>

<p>мне нужно было иметь возможность округлить до определенной цифры (не обязательно до целых чисел). я сделал категорию <code>nsnumber</code> (основываясь на <a href="https://stackoverflow.com/a/753928/347339">ответ эша</a> ) и добавил к ней следующий метод:</p><pre><code>- (nsstring *)stringbyrounding:(nsnumberformatterroundingmode)roundingmode topositionrightofdecimal:(nsuinteger)position { nsnumberformatter *formatter = [[nsnumberformatter alloc] init]; [formatter setmaximumfractiondigits:position]; [formatter setroundingmode:roundingmode]; nsstring *numberstring = [formatter stringfromnumber:self]; return numberstring; } </code></pre><p>что позволяет мне использовать это так:</p><pre><code>[anumber stringbyrounding:nsnumberformatterroundup topositionrightofdecimal:2]; </code></pre><p>я могу использовать его для округления до целых чисел, передавая <code>0</code> в качестве второго параметра:</p><pre><code>[anumber stringbyrounding:nsnumberformatterroundplain topositionrightofdecimal:0]; </code></pre>