Iphone 按小数点双倍计算的楼层

Iphone 按小数点双倍计算的楼层,iphone,c,objective-c,double,Iphone,C,Objective C,Double,我想用可变的小数长度(在iphone sdk中)按小数点的小数位数设置双精度地板 这里有一些例子来说明我的意思 NSLog(@"%f",[self floorMyNumber:34.52462 toPlace:2); // should return 34.52 NSLog(@"%f",[self floorMyNumber:34.52662 toPlace:2); // should return 34.52 NSLog(@"%f",[self floorMyNumber:34.52432

我想用可变的小数长度(在iphone sdk中)按小数点的小数位数设置双精度地板

这里有一些例子来说明我的意思

NSLog(@"%f",[self floorMyNumber:34.52462 toPlace:2); // should return 34.52
NSLog(@"%f",[self floorMyNumber:34.52662 toPlace:2); // should return 34.52

NSLog(@"%f",[self floorMyNumber:34.52432 toPlace:3); // should return 34.524
NSLog(@"%f",[self floorMyNumber:34.52462 toPlace:3); // should return 34.524

NSLog(@"%f",[self floorMyNumber:34.12462 toPlace:0); // should return 34.0
NSLog(@"%f",[self floorMyNumber:34.92462 toPlace:0); // should return 34.0
有什么办法吗

解决方案
如果只是为了打印它们而对它们进行舍入,那么可以使用标准的printf格式说明符进行舍入。例如,要打印3位小数,可以使用“%.3f”而不是“%f”

另一种解决方案:

放置的是10(示例:13.1)、100(示例:12.31),依此类推

double value=(double)((unsigned int)(value*(double)placed))/(double)placed

使用sprintf(或更好的snprintf)将其格式化为字符串,然后裁剪字符串的结尾。

将其乘以10^(小数位),将其转换为整数,然后除以10^(小数位)

double-floorPlace(双倍数字,整数位置)
{
整数小数位数=1;
对于(int i=0;i
不,我是说“地板”。“%.3f”的结果是34.525,数字是34.5246,而不是34.524。这看起来很可怕。但检查我上面的编辑,它就像一个魅力。谢谢强制转换为无符号int将导致所有负值变为非常大的正值,并溢出较大的有效双精度。买家要小心。你不能做
double value=floor(value*(double)placed)/(double)placed吗而不是冒着rpetrich提到的风险?@Wevah看起来你的版本正在运行。你能解释一下区别吗?唯一真正的区别是它避免了无符号int
强制转换,从而避免了负值和非常大的值(即大于
UINT_MAX
)的溢出问题。是的。没关系。没有受伤的感觉。嗯,解决方案缺乏准确性。检查此问题:
-(double)floorNumberByDecimalPlace:(float)number place:(int)place {
    return (double)((unsigned int)(number * (double)pow(10.0,(double)place))) / (double)pow(10.0,(double)place);
}
double floorToPlace(double number, int places)
{
    int decimalPlaces = 1;
    for (int i = 0; i < places; i++) divideBy *= 10;

    return (int)(number * decimalPlaces) / (double)decimalPlaces;
}