Objective c 目标C:正确输入3位小数

Objective c 目标C:正确输入3位小数,objective-c,math,rounding,floor,Objective C,Math,Rounding,Floor,我试图将浮点值降低到第三个小数点。例如,值2.56976应为2.569,而不是2.570。我搜索并找到了如下答案: 这些答案并不准确。例如,代码: double value = (double)((unsigned int)(value * (double)placed)) / (double)placed 可以返回值-1,这是不正确的。value和placed的相乘value*(double)placed)可能会引入如下内容:2100.999996。当更改为unsigned int时,它变

我试图将浮点值降低到第三个小数点。例如,值2.56976应为2.569,而不是2.570。我搜索并找到了如下答案:

这些答案并不准确。例如,代码:

double value = (double)((unsigned int)(value * (double)placed)) / (double)placed
可以返回
值-1
,这是不正确的。value和placed的相乘
value*(double)placed)
可能会引入如下内容:2100.999996。当更改为unsigned int时,它变为2100,这是错误的(正确的值应为2101)。其他答案也有同样的问题。在Java中,您可以使用
BigDecimal
,这样可以省去所有的麻烦


(注意:当然,将2100.9999四舍五入不是一个选项,因为它会破坏地板的整个概念,使其“正确地使用3位小数”)

以下代码应该有效:

#include <stdio.h>
#include <math.h>
int main(void) {
    double value = 1.23456;
    double val3;
    val3 = floor(1000.0 * value + 0.0001) * 0.001; // add 0.0001 to "fix" binary representation problem
    printf("val3 is %.8f; the error is %f\n", val3, 1.234 - val3);
}

如果有任何剩余误差,那是因为浮点数不一定能精确表示——BigDecimal和类似的东西背后的想法是以非常明确的方式解决这个问题(例如,将数字表示为其数字,而不是二进制表示——它效率较低,但保持精度)

< P>我必须考虑一个涉及NSCONG的解决方案,它的工作方式很有魅力。下面是完整的方法:

- (float) getFlooredPrice:(float) passedPrice {

    NSString *floatPassedPriceString = [NSString stringWithFormat:@"%f", passedPrice];
    NSArray *floatArray = [floatPassedPriceString componentsSeparatedByString:@"."];
    NSString *fixedPart = [floatArray objectAtIndex:0];
    NSString *decimalPart = @"";
    if ([floatArray count] > 1) {
        NSString *decimalPartWhole = [floatArray objectAtIndex:1];
        if (decimalPartWhole.length > 3) {
            decimalPart = [decimalPartWhole substringToIndex:3];
        } else {
            decimalPart = decimalPartWhole;
        }
    }
    NSString *wholeNumber = [NSString stringWithFormat:@"%@.%@", fixedPart, decimalPart];

    return [wholeNumber floatValue];

}
例如,值2.56976应为2.569,而不是2.570

解决方案很简单,如下所示:

double result = floor(2.56976 * 1000.0) / 1000.0;
我不知道你为什么要搜索复杂的东西……这很好用,不需要经过一些
无符号int
或其他
+0.0001
或任何东西

重要提示:

NSLog(@"%.4f", myDouble);

实际上,对变量进行一轮运算。因此,不应该认为可以使用
%.Xf

作为底数。好吧,这也不起作用。例如,我使用了value=2.099。乘以1000.0*的值得到2098.9997711182,当底数为2098(不正确)@A.沙头原因是
2.099
实际上存储为
2.09899997711182
,原因与您上一个问题中给出的相同。这很奇怪-在我的机器(64位Mac)上,我从2.099开始时得到2.09900000。“地板”的问题功能是,即使你只差一点点,它也会真正向下舍入。如果你能容忍当数字在下一个数字的0.000001范围内时“向上舍入”,它会变得更稳健。你使用的是什么平台(位深度)?我已经用建议的“修复”更新了我的答案“但是,代码< >楼层< /代码>函数有一个讨厌的间断,你不会轻易地绕过……@ Floris我正在为IOS模拟器搭建。我知道,我想我应该考虑从SART开始准备好日期。好的,祝你好运。我想知道你的平台上是否有一个<代码>长双< /代码>类型。以上代码有效。编译器中的
sizeof(double)
是什么?我在这里给出的解决方案不是有帮助吗?在铺地板之前,您需要将要铺地板的数字增加一半。您还可以使用
NSDecimalNumber
,它可以精确地表示多达38位的十进制数字。
NSLog(@"%.4f", myDouble);