簡體   English   中英

在Objective-C中指定精度的舍入數

[英]Round number to specified precision in Objective-C

我試圖使用舍入的半舍入方法將數字舍入到指定的精度。 (即0.5將是1舍入到一個精度)。 我嘗試了另一個SO問題的以下內容,但它未能正確舍入:

//where x is number and precision is precision
int num = floor(log10(abs(x))) - precision + 1;
double temp = pow(10, num);
return floor(x / temp + 0.5) * temp;

示例:2.55輪到2.5,而我需要它舍入到2.6

我想知道是否有人有更好的方法將數字四舍五入到給定的精度。 我已經嘗試修改此方法但沒有成功。

使用NSDecimalNumber可獲得更高的精度。 請參閱NSRoundingMode了解不同的舍入模式(我想你想要NSRoundPlain

NSDecimalNumberHandler *rounder = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:precision raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];

NSDecimalNumber *number;
NSDecimaNumber *rounded = [number decimalNumberByRoundingAccordingToBehavior:rounder];

有關處理程序中BOOL參數的更多信息,請參閱文檔

對你想要的東西來說似乎有點過分,但它確保你的數字很少會失去精確度。

改變scale的爭論的rounder更好的搜索結果更多的數字(即你的precision變量)。

嘗試這個:

-(double)roundNumber:(double)num toPrecision:(int)precision {

    double exact = num * pow(10, precision);
    double floor = floorl(exact);

    if ((floor + 1) <= (exact + 0.50)) {
        return (double) ((floor + 1) / pow(10, precision));
    }

    else
    {
        return (double) (floor / pow(10, precision));
    }

}

精度如下:2.1,舍入到.1將是1精度。 舍入為2將是0精度。 對於像12.4這樣的東西,-1精度將是10.這是非常可靠的,我沒有發現任何錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM