我有两个NSDecimalNumbers,我需要将一个应用到另一个的功能,原来这个代码使用了双打,我可以使用pow()函数计算这个:
double result = pow(value1, value2);
我遇到的问题是我将代码转换为使用NSDecimalNumbers,虽然它们包含方法toThePowerOf,但它只接受int值。目前,我遇到此问题的唯一解决方案是暂时转换NSDecimalNumbers,但这会导致精度损失。
double value1 = [decimal1 doubleValue];
double value2 = [decimal2 doubleValue];
double result = pow(value1, value2);
NSDecimalNumber *decimalResult = [[NSDecimalNumber alloc] initWithDouble:result];
有没有办法用NSDecimalNumbers进行计算而不会失去精度?
我需要这个来处理非整数值,例如:
value1 = 1.06
value2 = 0.0277777777
答案 0 :(得分:4)
正如Joe指出的那样,如果你想为正整数幂执行此操作,可以对从NSDecimalNumber派生的NSDecimal结构使用NSDecimalPower()
(我个人更喜欢使用结构,performance reasons )。
对于使用负整数和小数值的更一般情况,我有一些代码,我已经从Dave DeLong的DDMathParser库中修改过。此后他删除了此库的NSDecimal部分,但您可以找到the last commit for this support。我将Dave的指数支持扩展到以下函数中:
extern NSDecimal DDDecimalPower(NSDecimal d, NSDecimal power) {
NSDecimal r = DDDecimalOne();
NSDecimal zero = DDDecimalZero();
NSComparisonResult compareToZero = NSDecimalCompare(&zero, &power);
if (compareToZero == NSOrderedSame) {
return r;
}
if (DDDecimalIsInteger(power))
{
if (compareToZero == NSOrderedAscending)
{
// we can only use the NSDecimal function for positive integers
NSUInteger p = DDUIntegerFromDecimal(power);
NSDecimalPower(&r, &d, p, NSRoundBankers);
}
else
{
// For negative integers, we can take the inverse of the positive root
NSUInteger p = DDUIntegerFromDecimal(power);
p = -p;
NSDecimalPower(&r, &d, p, NSRoundBankers);
r = DDDecimalInverse(r);
}
} else {
// Check whether this is the inverse of an integer
NSDecimal inversePower = DDDecimalInverse(power);
NSDecimalRound(&inversePower, &inversePower, 34, NSRoundBankers); // Round to 34 digits to deal with cases like 1/3
if (DDDecimalIsInteger(inversePower))
{
r = DDDecimalNthRoot(d, inversePower);
}
else
{
double base = DDDoubleFromDecimal(d);
double p = DDDoubleFromDecimal(power);
double result = pow(base, p);
r = DDDecimalFromDouble(result);
}
}
return r;
}
这会对正整数幂,负整数幂和直接映射到根的分数幂进行精确计算。尽管如此,它仍然会依赖于不能完全落入其中一个分档的分数幂的浮点计算。
不幸的是,这需要他的一些其他支持功能才能工作。因此,我上传了提供此功能的_DDDecimalFunctions.h和_DDDecimalFunctions.m的增强版本。它们还包括NSDecimal三角函数,对数和一些其他函数。目前在切线实施方面存在一些收敛问题,这就是为什么我还没有完成关于此的公开发布。
答案 1 :(得分:1)
我最近遇到了同样的问题并开发了我自己的功能来做到这一点。该函数将计算任何基数与任何幂,只要它确定真实答案如果它确定无法计算实际答案它返回NSDecimalnumber.notANumber
我已将我的解决方案发布为我发布的同一问题的答案,因此here是链接。