将 NSNumber 舍入到特定数量的有效数字
Round NSNumber to a specific number of significant digits
假设我有一个包含值 0.12345
的 NSNumber
对象。我想要的只是一个具有相同值的 NSNumber
对象,但四舍五入到指定数量的有效数字,比如 2,所以值看起来像这样:0.12
。
- 我不想将它转换为
NSString
并返回,这正是 the answers suggest 中的某些内容
- 我不想 cast/convert and/or 手动 multiplication/division like in this answer
是否有一种我缺少的明显方法?
要做到这一点并保持所有约束几乎是不可能的。 NSNumber
没有舍入方法,因此您将不得不转换为其他方法。显而易见的路线是转换为双精度和乘法、舍入和除法,但您说您不想这样做。这样就留下了这条路线:
NSNumber *round(NSNumber *number, NSInteger places, NSRoundingMode mode) {
NSDecimal d = number.decimalValue;
NSDecimal rd;
NSDecimalRound(&rd, &d, places, mode);
return [NSDecimalNumber decimalNumberWithDecimal:rd];
}
另一种 hacky 方法是:
- 将您的数字乘以 100 后将其转换为四舍五入。
int yourNum = 0.12345 * 100;
yourNum 现在是 12.
- 然后只要你需要这个数字除以 100 就可以了。
float yourNumF = yourNum / 100.0;
我自己不喜欢这种方法,但它符合您的要求。 :D
假设我有一个包含值 0.12345
的 NSNumber
对象。我想要的只是一个具有相同值的 NSNumber
对象,但四舍五入到指定数量的有效数字,比如 2,所以值看起来像这样:0.12
。
- 我不想将它转换为
NSString
并返回,这正是 the answers suggest 中的某些内容
- 我不想 cast/convert and/or 手动 multiplication/division like in this answer
是否有一种我缺少的明显方法?
要做到这一点并保持所有约束几乎是不可能的。 NSNumber
没有舍入方法,因此您将不得不转换为其他方法。显而易见的路线是转换为双精度和乘法、舍入和除法,但您说您不想这样做。这样就留下了这条路线:
NSNumber *round(NSNumber *number, NSInteger places, NSRoundingMode mode) {
NSDecimal d = number.decimalValue;
NSDecimal rd;
NSDecimalRound(&rd, &d, places, mode);
return [NSDecimalNumber decimalNumberWithDecimal:rd];
}
另一种 hacky 方法是:
- 将您的数字乘以 100 后将其转换为四舍五入。
int yourNum = 0.12345 * 100; yourNum 现在是 12.
- 然后只要你需要这个数字除以 100 就可以了。
float yourNumF = yourNum / 100.0;
我自己不喜欢这种方法,但它符合您的要求。 :D