NSRoundBankers没有按照Apple的记录工作

时间:2015-07-28 12:43:50

标签: ios objective-c ios7 ios8 nsdecimalnumber

所以,根据Apple关于 NSRoundBankers 的文档:

舍入到最接近的可能返回值;当两种可能性中间,返回最后一位数为偶数的可能性。

虽然对于正数而言确实如此,我没有得到负数的预期行为。以下是我在设备和模拟器上执行的代码,两者都打印完全相同的结果:

NSDecimalNumber *increment = [NSDecimalNumber decimalNumberWithMantissa:5 exponent:-2 isNegative:NO];
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithMantissa:10 exponent:-1 isNegative:YES];
NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundBankers scale:1 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
while ([number compare:@1] == NSOrderedAscending)
{
    NSLog(@";%@;%@", number, [number decimalNumberByRoundingAccordingToBehavior:handler]);
    number = [number decimalNumberByAdding:increment];
}

在负数上,它没有返回最后一位数是偶数的那个,它基本上是向下舍入的。

例如,对于 -0.85 ,我应该 -0.8 ,但我得到 -0.9

我做错了吗?

左表显示ACTUAL行为,红色标记错误的舍入值。

右表显示EXPECTED行为,绿色表示正确的舍入值。

iOS Java

1 个答案:

答案 0 :(得分:1)

今天偶然发现了这,可能是Foundation中的一个错误。如果swift-corelibs-foundation的源代码与实际的Foundation代码有关,那么我可能已经找到了罪魁祸首:https://github.com/apple/swift-corelibs-foundation/blob/70f8af962ff182c78a81673e75fe725b5b1b7827/Foundation/Decimal.swift#L1970

我认为应该从1970行的余数中减去1,而不是加1。基本原理:如果余数为5,加1到底有什么变化?情况落入低谷(第1972行),第1974行的检查以5或6成功。如果减为4,则将self上加1(第1979行),并且保持数字均匀。

UPD ,该问题已报告给Apple:FB7565793。

UPD 2 ,该问题已由Apple在iOS 14 / macOS 11.0的第一个Beta中修复。