我无法想象如何获得积分&来自NSDecimalnumber的十进制值。
例如,如果我有10,5,那么10& 5?
如果我有10& 5,怎么回到10,5?
但是我担心丢失小数。
这适用于国际化应用。例如,如果用户设置价格“124,2356”,我想加载&保存确切的数字。
嗯,这是方法,但不尊重小数位数。如果有一种方法可以从我当前设置的本地知道。
这是因为它代表货币价值......
答案 0 :(得分:19)
我使用2作为比例,因为你说这是货币,但你可以选择使用另一个舍入比例。我也忽略了舍入可能带来的任何例外,因为这是一个非常简单的例子。
NSDecimalNumberHandler *behavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:0 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
NSDecimalNumber *price = /* eg. 10.5 */;
NSDecimalNumber *dollars = [price decimalNumberByRoundingAccordingToBehavior: behavior];
NSDecimalNumber *cents = [price decimalNumberBySubtracting: dollars];
这将分别在dollars
和cents
变量中给出10和0.5。如果您想要整数,可以使用此方法将cents
乘以10的幂。
cents = [cents decimalNumberByMultiplyingByPowerOf10: 2];
这将使您cents
乘以100,在dollars
和cents
中为您提供10和5。你也应该知道你可以在这里使用10的负幂来划分。
所以,
cents = [cents decimalNumberByMultiplyingByPowerOf10: -2];
会撤消最后一个方法。
答案 1 :(得分:0)
不确定数学函数的目标c有什么,但
Math.floor(10.5) = 10
(10.5 - 10) * 10 = 5
一个更清晰的例子(10的cos)
Math.floor(20.4) = 20
(20.4 - 20) * 10 = 4;
另一个问题
(5 / 10) = .5
10 + .5 = 10.5
小数点上使用的10取决于小数位数...例如
Math.floor(20.44) = 20
(20.44 - 20) * 100 = 44;
要求您按100次
答案 2 :(得分:0)
如果您无法访问数学fns,这可能有效:
double val = [dn doubleValue]; // dn is a NSDecimalNumber*
int intPart = (int) val;
double doublePart = (val - intPart);
这可能会给你一些麻烦,循环可能永远不会终止,在这种情况下你必须在那里放一个计数器:
while (doublePart != (int)doublePart) doublePart*=10;
答案 3 :(得分:-1)
double floor (double x);
是一个POSIX函数。此函数可用于查找不大于x
的最高整数值。
double x = 10.5;
double y = floor (x);
// y = 10.0
double z = x - y;
// z = 0.5