2010-08-02 31 views
1

它正常启动。我正在为iPhone编写复杂的计算应用程序。我决定使用浮点数来表示数字。所以,时间开始四舍五入和格式化输出,但首先四舍五入。我想将数字舍入到不同的小数位数。 FOund没有有用的C函数。好的,我可以写我自己的。但是,我有从应用程序设置的数字来坚持。 我发现只有对象可以被持久化。 所以我开始挖掘NSNumber和NSDecimalNumber。特别是后者只有在看它时才会让人感到不适。委托需要实现圆整,没有smiple算术运算符,特殊的方法,而不是.... :( 而剩下的则纯C简单?NSDecimalNumber确实需要做一些非常简单的任务吗?

是否有任何其他的方式来简化这个?

回答

3

您可能可以使用theValue - fmod(theValue, 0.01)四舍五入,在这个例子中,最接近的为0.01)。但是请注意!

计算机实际上并不使用十进制数 - 也就是说,我们在正常生活中使用它们的方式为十位数字。它们使用二进制数字,包括浮点数字。它们也用二进制表示,这意味着“小数位数”并不总是浮点数的有意义的属性。

例如,浮点数不能准确地表示0.1,如果您尝试在代码中使用浮点数,则会得到类似于0.1000000001的值。您得到的确切值因实施而异,并且通过减去差异是不可纠正的,因为计算机无法知道之间存在差异 - 即可达到0.1。

这就是为什么类像NSDecimalNumber存在。他们模拟十进制数学给我们更多的理智。他们很容易出现许多与浮点相同的问题,但具有不同的值(例如1.0/3.0不完全表示为十进制,但仍然是离散值)。数字必须四舍五入到特定的小数位数,您需要使用NSDecimalNumber进行大多数小数运算。如果仅用于显示,则可以使用类似NSNumberFormatter的内容来获取显示值,而不用修改内存中的数字本身。

问题的第二部分 - 以用户默认值存储数值很容易解决。 NSNumber“包装”原始数字类型,但它可以解开:

NSNumber *n = [NSNumber numberWithDouble: 1.234567890]; 
double aDouble = [n doubleValue]; 
+0

谢谢!其实这两个答案都是有道理的。目前看来,在NSNumber中持久化的原始内容是最好的解决方案。不过,由于代码的可读性,我仍然希望避免使用NSDecimaNumber(我对Cocoa仍然很陌生......)。也许写一个小方法让银行家四舍五入原始的双重选择会是解决方案吗? – mbpro 2010-08-02 10:33:49

+0

请勿使用浮点数与货币做算术运算。 – JeremyP 2010-08-02 11:53:18

+0

我应该使用double还是NSDecimalNumber来代替它? – mbpro 2010-08-02 12:53:27

2

使用NSDecimalNSDecimalNumber只要你需要精确的精度,尤其是对任何会计/财务的东西。对于其它任何需要的精度,但你不需要确切精度,使用double,而不是一个floatNSNumber简直就是一个OBJ-C用于数字原语的对象封装器。

要进行格式设置和舍入,请看NSNumberFormatter。任何C原语编号都可以包含在NSNumber中,然后您可以使用NSNumberFormatter将其转换为NSString。起初它可能看起来有些笨拙,但在真实世界中使用时,它工作得很好,因为您获得了非常高的格式控制。

相关问题