Lup*_*upi 5 objective-c nsdecimalnumber ios ios7 ios8
因此,根据 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];
}
Run Code Online (Sandbox Code Playgroud)
对于负数,它不会返回最后一位为偶数的数字,它基本上是四舍五入。
例如,对于-0.85我应该得到-0.8,但我得到-0.9
难道我做错了什么?
左表显示了实际行为,红色标记了错误的四舍五入值。
右表显示了预期行为,绿色是正确的四舍五入值。
今天偶然发现了这一点,这可能是基金会的一个错误。如果 swift-corelibs-foundation 的源代码与实际的基金会代码有任何关系,我可能已经找到了罪魁祸首:https://github.com/apple/swift-corelibs-foundation/blob/70f8af962ff182c78a81673e75fe725b5b1b7827/Foundation/Decimal .swift#L1970 .
我认为应该从 1970 行的余数中减去1,而不是加上它。基本原理:如果余数是 5,加 1 实际上会改变什么?case 下降到谷底(第 1972 行),第 1974 行的检查无论是 5 还是 6 都会成功。如果减去后变为 4,它将阻止向self(第 1979 行)加 1 并保持数字为偶数。
UPD该问题已报告给 Apple:FB7565793。
UPD 2 Apple 在 iOS 14 / macOS 11.0 的第一个测试版中修复了该问题。