给定一个 NSDecimalNumber,我怎样才能找到指数(比例)?
虽然原则上应该可以通过首先转换为 NSString 然后进行一些丑陋的字符串操作来做到这一点,但我宁愿避免它。
使用 Java BigDecimal,我可以调用scale()方法来获取比例。
NSDecimalNumber 是否存在类似的简洁方法?
给定一个 NSDecimalNumber,我怎样才能找到指数(比例)?
虽然原则上应该可以通过首先转换为 NSString 然后进行一些丑陋的字符串操作来做到这一点,但我宁愿避免它。
使用 Java BigDecimal,我可以调用scale()方法来获取比例。
NSDecimalNumber 是否存在类似的简洁方法?
如果您出于某种原因确实需要指数(除了简单的显示,您可以配置一个数字格式化程序给您),您可以使用该-doubleValue
方法获取原始双精度值,然后用于frexp(3)
获取尾数和指数值。
用于执行和存储浮点数学的对象背后的整个设计是您可以更有效地处理计算和精度错误,但是,该设计的限制是一旦您从标量(例如 adouble
或尾数和指数的组合),您应该留在对象框架内,而不是转换回(可能)不太精确的格式。
我建议使用-doubleValue
是最好的选择,因为其他答案建议访问可能会更改的私有结构记录,并且使用这些建议没有精度损失,而事实上,很可能存在(如头文件中所述)。转换为双精度时,您和使用/阅读您的代码的人确切地知道可能出现的精度错误,因为该类型已被很好地理解并且有很好的文档记录。
最后,如果您想确定转换是否会导致错误,您可以创建并使用一个NSDecimalNumberHandler,它将为您提供有关在转换为双标量类型时可能会出现什么样的舍入/精度错误的信息。
我还建议您使用苹果错误报告器添加一个增强请求,说明您希望直接访问指数以及可能添加更高精度的类型,如-longDoubleValue
方法。
编辑包含更多信息
您可以访问它NSDecimal
:
int exponent = decimalNumber.decimalValue._exponent;
不,看起来NSDecimalNumber没有等价物。我想你可能必须自己写。
但是,如果您不介意深入研究(并忽略文档警告),您可能会查看从中返回的NSDecimal 结构-decimalValue
- 它有许多您可能会得到的字段。这在主观上是否比您的 NSString 操作更好或更差取决于您。
如果您想让表达式采用 base-10 形式(frexp(3) 似乎只做 base-2),您可以试试这个:
double mantissa = [someDecimalNumber doubleValue];
int exp = 0;
if (mantissa >= 1.0f) {
while (mantissa >= 1.0f) {
mantissa = mantissa / 10.0f;
exp++;
}
} else {
while (mantissa*10.0f < 1.0f) {
mantissa = mantissa * 10.0f;
exp--;
}
}
NSLog(@"%f = %f x 10^%d", [someDecimalNumber doubleValue], mantissa, exp);
您可以将该数字与NSDecimalNumber
尾数等于 1 的实例进行比较,从而更改指数。它可以像二进制搜索一样工作。