【问题标题】:Make a float only show two decimal places使浮点数只显示两位小数
【发布时间】:2010-10-08 07:30:45
【问题描述】:

我在float 中有值25.00,但是当我在屏幕上打印它时它是25.0000000
如何显示只有两位小数的值?

【问题讨论】:

  • var nf = NSNumberFormatter() nf.positiveFormat = "0.##" var numberAfterRound = nf.stringFromNumber(NSNumber(double: number))!

标签: objective-c formatting floating-point


【解决方案1】:

这不是数字如何存储的问题,而是您如何显示它的问题。将其转换为字符串时,您必须四舍五入到所需的精度,在您的情况下是两位小数。

例如:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];

%.02f 告诉格式化程序您将格式化一个浮点数 (%f),并且应该四舍五入到两个位置,并且应该用 0s 填充。

例如:

%f = 25.000000
%.f = 25
%.02f = 25.00

【讨论】:

  • 我注意到在您的示例中使用 %.2f 实际上返回 25.00 而不是 25。这很奇怪。
  • 我一直理解的方式是,小数点后的数字表示你有多少小数。所以,.2f 确实会给出 25.00,而 .4f 会给出 25.0000。
  • 如果有人好奇 人们是如何做到的 实际上得到 25.. @"%.f" 可以解决问题。上面写的,没有
  • @acecapades,如果你使用@"%.*f", decimalPlaces, number
  • 这可能是部分题外话,但我会添加另一种格式:%03.f = 025
【解决方案2】:

这里有一些更正-

//for 3145.559706

斯威夫特 3

let num: CGFloat = 3145.559706
print(String(format: "%f", num)) = 3145.559706
print(String(format: "%.f", num)) = 3145
print(String(format: "%.1f", num)) = 3145.6
print(String(format: "%.2f", num)) = 3145.56
print(String(format: "%.02f", num)) = 3145.56 // which is equal to @"%.2f"
print(String(format: "%.3f", num)) = 3145.560
print(String(format: "%.03f", num)) = 3145.560 // which is equal to @"%.3f"

Obj-C

@"%f"    = 3145.559706
@"%.f"   = 3146
@"%.1f"  = 3145.6
@"%.2f"  = 3145.56
@"%.02f" = 3145.56 // which is equal to @"%.2f"
@"%.3f"  = 3145.560
@"%.03f" = 3145.560 // which is equal to @"%.3f"

等等……

【讨论】:

  • 最后一个准确吗? @"%.03f" = 3145.566?你是怎么得到 .566 而不是 .560 的?
  • 决定小数位数的整数可以是变量吗?像 @"%.xf" 其中 x 可以是任何整数?
  • 如果您对@"%.f" 有疑问,请尝试@"%.0f"。我发现这可以在另一个没有的地方没有小数位
  • 谁能告诉我为什么你会使用 %.02f 而不是 %.2f?
【解决方案3】:

您也可以尝试使用 NSNumberFormatter:

NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];

您可能还需要设置否定格式,但我认为它足够聪明,可以弄清楚。

【讨论】:

  • 你需要这个 float numTwoDecimalDigits = atof([s UTF8String]);
【解决方案4】:

我根据上面的答案做了一个快速的扩展

extension Float {
    func round(decimalPlace:Int)->Float{
        let format = NSString(format: "%%.%if", decimalPlace)
        let string = NSString(format: format, self)
        return Float(atof(string.UTF8String))
    }
}

用法:

let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true

【讨论】:

  • 这个解决方案似乎也适用于 CGFloat。太棒了!
  • 这就是我想要的。谢谢老哥!
【解决方案5】:

在 Swift 语言中,如果你想展示你需要以这种方式使用它。在 UITextView 中赋值 double 值,例如:

let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)

如果你想像 Objective-c 使用 NSLog() 那样在 LOG 中显示,那么在 Swift 语言中你可以这样做:

println(NSString(format:"%.2f", result))

【讨论】:

    【解决方案6】:

    在 Objective-c 中,如果您正在处理常规字符数组(而不是指向 NSString 的指针),您也可以使用:

    printf("%.02f", your_float_var);
    

    OTOH,如果您想要将该值存储在您可以使用的 char 数组中:

    sprintf(your_char_ptr, "%.02f", your_float_var);
    

    【讨论】:

      【解决方案7】:

      所有答案的问题在于,乘法然后除法会导致精度问题,因为您使用了除法。我很久以前从 PDP8 上的编程中学到了这一点。 解决方法是:

      return roundf(number * 100) * .01;
      

      因此 15.6578 仅返回 15.66 而不是 15.6578999 或类似的意外。

      您想要什么级别的精度取决于您。只是不要将产品除以乘以十进制等值。 不需要有趣的字符串转换。

      【讨论】:

        【解决方案8】:

        在objective -c中你想以2个十进制数字显示浮点值然后传递参数指示你想显示多少个小数点 例如 0.02f 将打印 25.00 0.002f 将打印 25.000

        【讨论】:

          【解决方案9】:

          这里有一些根据精度动态格式化的方法:

          + (NSNumber *)numberFromString:(NSString *)string
          {
              if (string.length) {
                  NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
                  f.numberStyle = NSNumberFormatterDecimalStyle;
                  return [f numberFromString:string];
              } else {
                  return nil;
              }
          }
          
          + (NSString *)stringByFormattingString:(NSString *)string toPrecision:(NSInteger)precision
          {
              NSNumber *numberValue = [self numberFromString:string];
          
              if (numberValue) {
                  NSString *formatString = [NSString stringWithFormat:@"%%.%ldf", (long)precision];
                  return [NSString stringWithFormat:formatString, numberValue.floatValue];
              } else {
                  /* return original string */
                  return string;
              }
          }
          

          例如

          [TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];
          

          => 2.3453

          [TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];
          

          => 2

          [TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];
          

          => 2.35(向上取整)

          【讨论】:

          • 这是非常好的解决方案,非常感谢。你能向我解释一下它是如何工作的吗?我看到你添加了额外的 '%' 符号。
          【解决方案10】:

          Swift 的另一种方法(不使用 NSString):

          let percentage = 33.3333
          let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")
          

          附:此解决方案不适用于 CGFloat 类型,仅使用 FloatDouble

          测试

          【讨论】:

          • @Unknown downvoter 这是 swift 的有效解决方案,也与 swift 的其他答案不同,为什么?
          • 如果你可以返回一个浮点数,你总是可以将它转换为一个 CGFloat
          【解决方案11】:

          使用NSNumberFormattermaximumFractionDigits 如下:

          NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
          formatter.maximumFractionDigits = 2;
          NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);
          

          你会得到12.35

          【讨论】:

            【解决方案12】:

            如果你还需要浮动值:

            NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
            float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
            

            【讨论】:

              【解决方案13】:
               lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-06-29
                • 2011-09-03
                • 1970-01-01
                • 2012-06-30
                • 1970-01-01
                • 1970-01-01
                • 2011-03-10
                • 2023-03-05
                相关资源
                最近更新 更多