将Objective-C中的浮点数四舍五入到最接近的0.05

7

我想将以下浮点数四舍五入到最接近的0.05。

449.263824 --> 449.25

390.928070 --> 390.90

390.878082 --> 390.85

如何实现这个目标?


4
什么是取舍模式?看起来像是四舍五入到最接近的0.05?但实际上并不是,因为第二个和第三个例子都不符合。我们需要更多信息。 - Jesse Naugher
1
这是问题中的相同模式。对于390.928070,您希望第二个答案是390.90还是390.95? - Black Frog
2
除了最后一个,OP刚刚发布的那个不是最接近0.05的。 - Jesse Naugher
仅供澄清,两位小数的意思是:390.928070 = 390.93,而390.878082 = 390.89 - Black Frog
他想要向下取整,而不是取最接近0.05的数,他应该更新他的问题。 - malhal
显示剩余2条评论
6个回答

13

为了匹配你问题中的输出,你可以进行以下操作:

float customRounding(float value) {
    const float roundingValue = 0.05;
    int mulitpler = floor(value / roundingValue);
    return mulitpler * roundingValue;
}

示例:

NSLog(@"Output: %f --> %.2f", 449.263824, customRounding(449.263824));

这很有帮助,但我很好奇为什么要使用floor()而不是round()。前者难道不会将所有余数都截掉吗,而不是将其靠近所寻找的最近数字? - avance
1
问题的标题并不真正符合OP在问题中所问的内容。在问题的评论中,OP希望答案总是向下舍入。round函数返回“最近的整数,半路上远离零四舍五入”。我本可以使用舍入模式进行操作。但为了保持简单,我使用了floor函数。因此,一切都取决于您的要求。示例代码 - Black Frog
谢谢。看起来原帖的作者需要更新问题,或者修改示例以匹配它。 - avance
1
0.04将被舍入为0.00而不是0.05。将“floor”替换为“roundf”,它就可以完美地工作了。 - Yauheni Shauchenka
@YauheniShauchenka 使用roundf和使用round是相同的,它们产生相同的行为。在值2.99上使用roundf将导致3.00的结果。OP希望结果为2.95。 - Black Frog
@BlackFrog,你在评论中提到roundf和round,想表达什么意思?我只是注意到你应该用"roundf"替换"floor",或者如果你愿意,可以用"round"代替。就这样。 - Yauheni Shauchenka

4

这里有一个round()函数。我认为你需要这样做:

double rounded = round(number * 20.0) / 20.0;

与所有浮点运算一样,由于1/5不能直接表示为二进制值,因此您将看到奇怪的不完全准确的结果。如果您不喜欢这种情况,可以使用NSDecimalNumber的-decimalNumberByRoundingAccordingToBehaviour:方法,但速度会稍慢。

1
@Yasir,当 round(390.928070 * 20.0) / 20.0 = 390.95 时,你如何将其标记为正确答案?在你的问题中,你希望输出为 390.90 - Black Frog
@Yasir:Black Frog提出了一个很好的观点;我仍然不清楚您是想将值向下舍入到当前值下面的第一个0.05倍数,还是想将其截断为2dp并从那里四舍五入到最近的0.05。 - Tommy
@黑蛙:显然他在问题中犯了一个错误。 - JeremyP

2

我知道这个问题已经有答案了,但是我使用了以下代码:

float unrounded = 2.234;

float decimal = 0.05;
float decimal2 = 1/decimal;
float rounded = (((int)((unrounded*decimal2)+0.5))/decimal2);

例如:

> unrounded = 2.234 
> decimal = 0.05
> decimal2 = 1/0.05 = 20
> 
> rounded:
> 2.234 * 20 = 44.68
> 44.68 + 0.5 = 45.18 
> make an integer: 45 
> 45 / 20 = 2.25

0
如果要四舍五入到最近的x,那么可以使用以下代码:

roundedValue = originalValue + x * 0.5;
roundedValue -= fmodf(roundedValue, x);

就目前而言,你想要什么并不是完全清楚的。


这是我想要实现的正确模式:449.263824 --> 449.25390.928070 --> 390.90390.878082 --> 390.85 - Yasir Siddiqui

0

Use floor:

#include <math.h>
...
double result = floor(number * 20.0) / 20.0;

0

你可以使用NSNumberFormatter进行四舍五入,通过其中一个NSNumberFormatterRoundingMode选项来指定所需的舍入方式。(在上述类参考中搜索“NSNumberFormatterRoundingMode”以查看默认值。)

然而,正如@Jesse在您的问题评论中提到的那样,您提供的示例似乎没有任何标准的舍入方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接