【问题标题】:Round Double value in objective c目标 c 中的 Round Double 值
【发布时间】:2021-06-02 20:35:05
【问题描述】:

如果值为 1.66,如何在目标 c 中舍入 double 值,将值显示为 1.55,如果计算值更高,则缺少一个点值,这会产生影响?

self.priceLabel.text = [NSString stringWithFormat:@"%0.2f",totalPrice];

我使用过其他多种东西,包括格式化程序,但这个问题仍然存在

计算器的计算结果显示为 293.76,但通过这种方式显示的值为 293.75,我需要该值为 293.76

【问题讨论】:

  • ??? “.2f”在大多数情况下应该正确舍入 - 您是否可能意味着您还想对值本身进行舍入并在后续计算中使用它而不是多精度值?
  • @skaak 我只是想在某些情况下对值进行四舍五入,但值是正确的,但是当涉及到 .75 时,这会导致其中缺少 .1 值我该如何解决这个问题?
  • 您能否提供一个可重现的完整示例,在其中声明一个双精度变量、赋值、执行舍入,并向我们展示出了什么问题?
  • @AndreasOetjen totalPrice= totalPrice+([cart.quantity doubleValue]*[cart.price_vat doubleValue]); 我已经使用了这个并将它分配给我的标签,但是当价格为 293.76 时,它显示 293.75 self.priceLabel.text = [NSString stringWithFormat:@"%0.2f",totalPrice];
  • @iOSAppTester - 我认为你需要仔细检查你的数学。这个例子 - pastebin.com/3tVmwde9 - 工作正常。它生成了293.76double(实际值真的是293.75999999999999,因为是浮点数),NSString *s = [NSString stringWithFormat:@"%0.2f", totalPrice];生成的字符串符合预期... "293.76"

标签: ios objective-c iphone objective-c-category objective-c-2.0


【解决方案1】:

这里有一些东西来说明。

一切看起来都不错!?有什么问题?

#import <Foundation/Foundation.h>

NSString * round02( double val )
{
    return [NSString stringWithFormat:@"%.2f", val];
}

int main(int argc, const char * argv[]) {
    @autoreleasepool
    {
        // insert code here...
        NSLog(@"Hello, World!");

        double x = 0;

        while ( x < 3 )
        {
            x += 0.001;
            NSLog ( @"Have %f becomes %@ and %@", x, round02( x ), round02( -x ) );
        }
    }

    return 0;
}

时间流逝

事实上,我可以看到很多麻烦。不确定这是否是困扰您的原因,但例如在它显示的输出中

2021-03-04 12:37:13.116147+0200 Rounding[15709:202740] Have 2.723000 becomes 2.72 and -2.72
2021-03-04 12:37:13.116210+0200 Rounding[15709:202740] Have 2.724000 becomes 2.72 and -2.72
2021-03-04 12:37:13.116316+0200 Rounding[15709:202740] Have 2.725000 becomes 2.72 and -2.72
2021-03-04 12:37:13.116383+0200 Rounding[15709:202740] Have 2.726000 becomes 2.73 and -2.73

最后一个2.72 应该是2.73 但是,这又是一个复杂的问题。这是解决它的简单方法 - 如下例所示添加容差。

NSString * round02( double val )
{
    double tol = 0.0005;

    if ( val >= 0 )
    {
        return [NSString stringWithFormat:@"%.2f", val + tol];
    }
    else
    {
        return [NSString stringWithFormat:@"%.2f", val - tol];
    }
}

这并不能直接解决复杂性,并且在某些情况下它也会失败,但它对于完成工作会有很长的路要走,例如现在输出显示

2021-03-04 12:40:11.274826+0200 Rounding[15727:204617] Have 2.723000 becomes 2.72 and -2.72
2021-03-04 12:40:11.274941+0200 Rounding[15727:204617] Have 2.724000 becomes 2.72 and -2.72
2021-03-04 12:40:11.275016+0200 Rounding[15727:204617] Have 2.725000 becomes 2.73 and -2.73
2021-03-04 12:40:11.275096+0200 Rounding[15727:204617] Have 2.726000 becomes 2.73 and -2.73

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2021-11-07
    相关资源
    最近更新 更多