Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 我在花车上兜圈子_Objective C_Ios_Floating Point_Rounding - Fatal编程技术网

Objective c 我在花车上兜圈子

Objective c 我在花车上兜圈子,objective-c,ios,floating-point,rounding,Objective C,Ios,Floating Point,Rounding,我有一个小数位数较多的浮点数,例如: float fRes = 10.0 / 3.0; 实际上,fRes值是3.3333 例如,可以设置2位十进制数字: float fRes = 10.0 / 3.0; // fRes is 3.333333333333333333333333 float fResOk = FuncRound( fRes, 2 ); // fResOk is 3.33 提前感谢假设您正在寻找正确的函数来舍入到特定的位数,您可能会发现执行以下操作最简单: fResOk = r

我有一个小数位数较多的浮点数,例如:

float fRes = 10.0 / 3.0;
实际上,fRes值是3.3333 例如,可以设置2位十进制数字:

float fRes = 10.0 / 3.0;
// fRes is 3.333333333333333333333333
float fResOk = FuncRound( fRes, 2 );
// fResOk is 3.33

提前感谢

假设您正在寻找正确的函数来舍入到特定的位数,您可能会发现执行以下操作最简单:

fResOk = roundf( fRes*100.0)/100.0;

这将把值乘以
100
(给你2位有效数字),对值进行四舍五入,然后将其减小到最初的大小。

我不知道你在哪里使用这个四舍五入的数字,但你只应该在向用户显示时对值进行四舍五入,例如,有一些基于C的格式字符串方法可以对浮点数进行四舍五入

[NSString stringWithFormat:@"%.2f", value];

正如您可能已经读到的,浮点数是实数的近似值,因此做
fResOk=roundf(fRes*100.0)/100.0可能不会给出3.33,但它是一个与浮点数3.33最接近的数字。

给你!通常情况下,这种可能的重复实际上不会起作用,因为浮点使用的是二进制,而不是小数点,所以许多十进制的精确数字在使用浮点算术时不能精确表示。如果您要查找精确的值,这是真的。然而,考虑到这首先是一个四舍五入问题,假设一个接近机器内部表示精度的数字就足够了。如果你真的需要一个精确到两个小数点的数字,你应该创建一个定点数字系统(iOS或Objective-C中没有内置的),或者你可以在开始时乘以100并强制转换为整数,然后在以后使用定额后再除以100(基本上模拟你自己的定额)。一方面,有时候你应该把数字四舍五入。当使用美元时,你通常应该四舍五入到最接近的美分。另一方面,如果你的钱足够多,因此四舍五入计算非常重要,那么你应该使用十进制数学(NSDecimal)。即使这样,你也不应该四舍五入,每次四舍五入都会引入一个错误,你没有向你的数字添加任何更好的信息,你正在带走信息,这包括输出到字符串的时间。对于货币,我将使用表示美分的整数。与使用整数表示美分相比,NSDecimal在某些计算中提供了更好的精度。您可以定义舍入行为,而不是使用整数除法中经常发生的截断。想想销售税的计算。另一方面,十进制数学计算比整数或浮点计算慢得多。@adamek:你不应该四舍五入到最接近的分,你应该找出是否有任何法律规则(如税法、贸易法等)告诉你如何四舍五入,并相应地四舍五入,如果你计算的数字不是纯粹的信息,这就是为什么我使用RoundBankers模式。枚举NSRoundingMode:UInt{case RoundPlain case RoundDown case RoundUp case RoundBankers}