Objective c 目标C:正确输入3位小数
我试图将浮点值降低到第三个小数点。例如,值2.56976应为2.569,而不是2.570。我搜索并找到了如下答案: 这些答案并不准确。例如,代码: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时,它变
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);