【问题标题】:Rounding a float number in objective-c在objective-c中舍入一个浮点数
【发布时间】:2012-07-10 09:55:56
【问题描述】:

我想知道是否有一个简单的函数可以使用这样的示例。 我有一个

float value = 1.12345;

我想通过调用类似

float value2 = [roundFloat value:value decimal:3];
NSLog(@"value2 = %f", value2);

我得到“1.123” 是否有任何Library 或默认函数,或者我应该为这种类型的计算编写一个代码块?

提前感谢您的帮助

【问题讨论】:

    标签: objective-c floating-point rounding


    【解决方案1】:

    使用NSLog(@"%f", theFloat) 总是输出六位小数,例如:

    float theFloat = 1;
    NSLog(@"%f",theFloat);
    

    输出:

    1.000000
    

    换句话说,你永远不会通过使用NSLog(@"%f", theFloat)获得1.123

    小数点后三位:

    float theFloat = 1.23456;
    float newFLoat = (int)(theFloat * 1000.0) / 1000.0;
    NSLog(@"%f",newFLoat);
    

    输出:

    1.234000
    

    四舍五入到小数点后三位(使用roundf() / lroundf() / ceil() / floor()):

    float theFloat = 1.23456;
    float newFLoat = (int)(roundf(theFloat * 1000.0)) / 1000.0;
    NSLog(@"%f",newFLoat);
    

    输出:

    1.235000
    

    四舍五入到小数点后三位(脏方法):

    float theFloat = 1.23456;
    NSString *theString = [NSString stringWithFormat:@"%.3f", theFloat];
    float newFloat = [theString floatValue];
    NSLog(@"%@",theString);
    NSLog(@"%f",newFloat);
    

    输出:

    1.235
    1.235000
    

    【讨论】:

    • %f 不输出 6 位小数,它四舍五入到 6 位小数。实际的浮点值不是那么漂亮。
    • 这仅适用于具有精确表示为二进制分数的某些值。它在超过 90% 的情况下不起作用。
    【解决方案2】:

    用于打印值使用:

    NSLog(@"value2 = %.3f", value2);

    在计算前四舍五入到 3 位小数实际上没有意义,因为 float 不是一个精确的数字。即使你将它四舍五入到1.123,它也会像1.122999999998

    规则:

    1. 通常你只为了打印结果而四舍五入 - 字符串格式化程序可以处理它(见上文)。
    2. 对于精确计算(例如货币),不要使用浮点数,使用NSDecimalNumber 或定点算法。

    【讨论】:

    • 感谢您的帮助,但在此示例中,我应该使用float,并且任何额外的小数都会在我的具体计算中产生一些错误。但也感谢您的帮助
    • 我尝试了 NSDecimalNumber,这也很棒。谢谢你的建议。 +1
    • @nfarshchi 这个说法是自相矛盾的。 要么你必须使用浮点数或者你必须有一个特定的小数位数。你不能两者兼得:这在数学上是不可能的。
    【解决方案3】:

    浮点数没有小数位,它们有二进制位。小数基数有小数位。除非您转换为十进制基数,否则您不能将浮点数四舍五入到特定的小数位数。 返回浮点值的例程、方法、函数等不可能执行此任务。

    【讨论】:

      【解决方案4】:

      请注意,“圆”不一定像您想象的那样简单。例如

      DIY Calculator: Rounding Algorithms 101 列出了 16 种不同的舍入方法。

      Wikipedia:Rounding 涵盖了很多相同的领域

      Cplusplus 有一堆Rounding Algorithms 的源代码,很容易翻译成objective-c

      您希望如何舍入取决于您处理数据的上下文。

      我应该指出,Stack Overflow 已经有一个 plethora of other questions about rounding in objective-c

      【讨论】:

        【解决方案5】:
        //Your Number to Round (can be predefined or whatever you need it to be)
        float numberToRound = 1.12345;
        
        float min = ([ [[NSString alloc]initWithFormat:@"%.0f",numberToRound] floatValue]);
        float max = min + 1;
        float maxdif = max - numberToRound;
        if (maxdif > .5) {
            numberToRound = min;
        }else{
            numberToRound = max;
        }
        
        //numberToRound will now equal it's closest whole number (in this case, it's 1)
        

        【讨论】:

          【解决方案6】:

          这是一个简单的方法:

          float numberToRound = 1.12345f;
          float remainder = numberToRound*1000.0f - (float)((int)(numberToRound*1000.0f));
          
          if (remainder >= 0.5f) {
              numberToRound = (float)((int)(numberToRound*1000.0f) + 1)/1000.0f;
          }
          else {
              numberToRound = (float)((int)(numberToRound*1000.0f))/1000.0f;
          }
          

          对于任意小数位,将上述代码中的 1000.0f 替换为

          float mult = powf(10.0f, decimal);
          

          【讨论】:

            【解决方案7】:

            试试

            #import <math.h>
            
            float cutFloat( float number, int decimal) {
                number = number*( pow(10,decimal) );
                number = (int)number;
                number = number/( pow(10,decimal) ) ;
            
                return number;
            }
            

            【讨论】:

            • 此解决方案不会对数字进行四舍五入。它会将其削减到特定的小数位。
            • 而且在大多数情况下它甚至都不能正确地做到这一点。
            猜你喜欢
            • 2011-06-09
            • 1970-01-01
            • 1970-01-01
            • 2015-05-23
            • 1970-01-01
            • 1970-01-01
            • 2015-09-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多