【问题标题】:NSRoundBankers is not working as documented by AppleNSRoundBankers 没有按照 Apple 记录的那样工作
【发布时间】:2015-10-19 00:45:06
【问题描述】:

因此,根据 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

我做错了吗?

左表显示了实际行为,红色标记了错误的四舍五入值。

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

【问题讨论】:

  • 它只发生在 -0.85....你也尝试过其他数字吗?
  • 是的,你可以在表中看到 -0.65 应该是 -0.6 但它是 -0.7 与 -0.45、-0.25、-0.05 相同的东西.....
  • 你试过 nsroundplain 吗?如果那也不能锻炼……那就向苹果报告吧!!!
  • 我们需要在后端和客户端上具有相同的行为,所以我真的不能选择不同的舍入方法。 ://
  • 在文档中:developer.apple.com/library/mac/documentation/Cocoa/Reference/… Apple 展示了 NSRoundBankers 将 -1.35 舍入为 -1.4 的示例,因此这似乎是设计行为。

标签: ios objective-c ios7 ios8 nsdecimalnumber


【解决方案1】:

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

我认为 1 应该从 1970 行的余数中减去,而不是添加到其中。基本原理:如果余数是 5,加 1 实际上会改变什么?案例下降(第 1972 行),第 1974 行的检查成功,无论是 5 还是 6。如果减去后变为 4,它将阻止将 1 添加到 self(第 1979 行)并保持偶数。

UPD已向 Apple 报告该问题:FB7565793。

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

【讨论】:

  • 我很惊讶这仍然是相关的,并且在 4.5 年后正在发生。 :D GJ 正在挖掘代码并报告一个可能的错误 ?
  • 更新:Apple 在 iOS 14 / macOS 11.0 的第一个测试版中已修复此问题。
猜你喜欢
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多