您可能可以使用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];
谢谢!其实这两个答案都是有道理的。目前看来,在NSNumber中持久化的原始内容是最好的解决方案。不过,由于代码的可读性,我仍然希望避免使用NSDecimaNumber(我对Cocoa仍然很陌生......)。也许写一个小方法让银行家四舍五入原始的双重选择会是解决方案吗? – mbpro 2010-08-02 10:33:49
请勿使用浮点数与货币做算术运算。 – JeremyP 2010-08-02 11:53:18
我应该使用double还是NSDecimalNumber来代替它? – mbpro 2010-08-02 12:53:27