2

我正在尝试将浮点值设置为小数点后三位。例如,值 2.56976 应为 2.569 而不是 2.570。我搜索并找到了这样的答案:

小数点双倍下限

这样的答案并不准确。例如代码:

double value = (double)((unsigned int)(value * (double)placed)) / (double)placed

可以返回value - 1,这是不正确的。价值和位置的乘法value * (double)placed)可能会引入类似:2100.999999996。改成 unsigned int 后变成 2100 是错误的(正确的值应该是 2101)。其他答案也存在同样的问题。在 Java 中,您可以使用BigDecimalwhich 来节省所有麻烦。

(注意:当然,将 2100.9999 四舍五入不是一个选项,因为它破坏了将地板的整个想法改为“正确 3 位小数”)

4

3 回答 3

0

我不得不考虑一个涉及 NSString 的解决方案,它就像一个魅力。这是完整的方法:

- (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];

}
于 2013-06-18T07:12:53.363 回答
0

以下代码应该可以工作:

#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);
}

这打印出来

val3 is 1.23400000; the error is 0.000000

如果有任何残留错误,它来自于浮点数不一定能被精确表示的事实 - BigDecimal 背后的想法和类似的东西是以非常明确的方式解决这个问题(例如,通过将数字表示为其数字,而不是二进制表示 - 它效率较低,但保持准确性)

于 2013-06-18T02:29:16.410 回答
0

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

解决方案很简单:

double result = floor(2.56976 * 1000.0) / 1000.0;

我不知道你为什么要搜索并发症......这很完美,不需要经过一些unsigned int或其他+ 0.0001或其他任何事情。

重要的提示 :

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

实际上对您的变量进行一轮。所以相信你可以用%.Xf

于 2015-02-25T08:28:27.937 回答