【问题标题】:Round value the float value in iOSiOS中的浮点值四舍五入
【发布时间】:2011-12-22 11:14:45
【问题描述】:

我正在开发一个应用程序并希望对值进行四舍五入 即如果输出是 4.8 我想显示 4.8 而如果输出是 4.0 ,我想显示 4

另外,如果我可以精确地四舍五入,那就太好了:如果值是 4.34 然后四舍五入到 4.3,如果它是 4.37 然后四舍五入到 4.4

【问题讨论】:

  • 所以你想四舍五入到最接近的十分之一?这会变得很棘手,因为浮点数实际上不能保存这样的值。这只是为了展示吗?
  • Rounding numbers in Objective-C 的可能副本。如果这只是为了显示,只需使用格式化程序。将数字的显示与实际数字分开。
  • 那么到目前为止你尝试过什么?
  • @iDev - 我给了你一个提示,你在下面有一些答案。尝试编写你自己的代码来解决这个问题,我们会看看它。
  • 这是一个旧线程,但我只是在寻找其他内容时偶然发现了它。我发现每个人都错过了 OP 试图实现的目标很有趣:如果数字是整数,他不想有小数点。

标签: iphone objective-c ios xcode nsnumber


【解决方案1】:
    float number=17.125;
NSNumberFormatter *format = [[NSNumberFormatter alloc]init];
[format setNumberStyle:NSNumberFormatterDecimalStyle];
[format setRoundingMode:NSNumberFormatterRoundHalfUp];
[format setMaximumFractionDigits:2];
NSString *temp = [format stringFromNumber:[NSNumber numberWithFloat:number]];
NSLog(@"%@",temp);

【讨论】:

    【解决方案2】:
    double myNumber = 7.99;
    NSString *formattedNumber = [NSString stringWithFormat:@"%.*f",
        fmod(round(myNumber * 10), 10) ? 1 : 0, myNumber];
    

    【讨论】:

      【解决方案3】:

      您需要先了解如何在纸上进行四舍五入,而不需要有人向您展示代码。写下一些数字并弄清楚如何四舍五入。

      要四舍五入到特定的小数位置,请将该位置的值的一半相加,然后截断。即 1.67 + 0.05 = 1.72 然后截断为 1.7。

      但是编程中有两件棘手的事情是在纸上进行时不存在的:

      1. 知道如何截断 -- 编程时有几种方法可以做到这一点,但它们并不简单。
      2. 处理浮点数不精确的事实。即,没有精确的表示,例如 1.7,但最接近的两个数字往往是 1.69998 和 1.700001 之类的东西

      对于截断将数字乘以 10 的适当幂以产生整数的技巧效果很好。例如,(1.67 + 0.05) * 10 = 17.2,然后转换为 int 得到 17,然后转换回 float 并除以 10 得到 1.7(或多或少)。或者(如果您正在打印或显示该值)只需格式化插入小数点的整数。 (通过格式化整数值,您不必处理不精确的浮点表示的问题。)

      如果你想抑制尾随零,它会变得有点棘手,你可能必须实际编写一些代码——格式化数字,然后向后扫描并删除任何尾随零直到小数点。 (如果您愿意,也可以使用小数点。)

      【讨论】:

      • 我仍然认为减去整数值,然后将结果与 0 进行比较(在浮点算术的小误差范围内)更快地找到尾随零
      【解决方案4】:

      一种舍入浮点值的方法是添加 0.5,然后截断该值。

      double valueToRound = GetTheValueFromSomewhere();
      double roundedValue = (double)((int)(valueToRound + 0.5));
      

      例如,这会将 1.4 向下舍入为 1.0,将 1.5 向上舍入为 2.0。如您所述,要四舍五入到其他小数位,只需将初始值乘以 10 或 100 等。使用相同类型的代码,然后将结果除以相同的数字,您将得到相同的结果,无论是小数点你想要的地方。

      这是一个以任意精度进行舍入的示例。

      double valueToRound = GetTheValueFromSomewhere();
      int decimalPrecisionAtWhichToRound = 0;
      double scale = 10^decimalPrecisionAtWhichToRound;
      double tmp = valueToRound * scale;
      tmp = (double)((int)(tmp + 0.5));
      double roundedValue = tmp / scale;
      

      因此,如果在上面将 decimalPrecisionAtWhichToRound 设置为 0,它将四舍五入为最接近的整数。 1.4 将四舍五入为 1.0。 1.5 将四舍五入为 2.0。

      如果您将 decimalPrecisionAtWhichToRound 设置为 1,它将四舍五入到最接近的十分之一。 1.45 将舍入为 1.5,1.43 将舍入为 1.4。

      【讨论】:

      • 我只想将 1.4 舍入到 1.4 并将 1.0 舍入到 1,这可能吗?
      • 如果您应用我发布的代码,然后先乘以 10,然后再除以 10,则 1.4 将四舍五入为 1.4,而 1.0 将四舍五入为 1.0。此外,1.44 将四舍五入为 1.4,而 1.46 将四舍五入为 1.5。所以它是同样的事情,你只是根据你希望四舍五入发生的距离预先乘以 10 和后除以 10。
      • 但是我也希望 1.0 在我的应用程序中舍入到 1
      • 如何显示它,我的意思是如果我使用 %.f 那么它给我 4.0,如果我使用 %f 然后 4.000000 和 %i 我失去了 4.1 的精度
      • 格式化时可以使用 "%.*f" 然后提供 2 个参数,首先是精度,然后是实际值。这使您可以控制数字的格式精度。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多