我正在尝试使用舍入的半舍入方法将数字舍入到指定的精度。 (即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
我想知道是否有人有更好的方法将数字四舍五入到给定的精度。我已经尝试修改此方法但没有成功。
答案 0 :(得分:8)
使用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
参数的详细信息,请参阅docs。
对于你想要的东西来说,这似乎有些过分,但它确保你的数字很少会失去精确度。
更改rounder
的{{3}}参数,以获取结果中的更多数字(即您的precision
变量)。
答案 1 :(得分:2)
试试这个:
-(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.这非常可靠,我没有发现任何错误。