gpt4 book ai didi

ios - 将 NSDecimalNumber 转换为 NSString 时,NSNumberFormatter 舍入不正确

转载 作者:行者123 更新时间:2023-11-28 22:15:47 25 4
gpt4 key购买 nike

在尝试计算适用于产品的税额并将其显示在标签中时,我正在运行以下代码。此税应使用银行四舍五入(与 NSNumberFormatterRoundHalfEven 相同)

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[formatter setRoundingMode:NSNumberFormatterRoundHalfEven];

NSDecimalNumber *decimalTax = [NSDecimalNumber decimalNumberWithString:@"3.785272"];

NSLog(@" tax : %@", decimalTax);
NSString *rightText = [formatter stringFromNumber: decimalTax];
NSLog(@" textLabel : %@", rightText);

输出如下:

tax : 3.785272
textLabel : $3.79

使用 NSNumberFormatterRoundHalfEven 时,税收应四舍五入为 3.78,而不是 3.79。我不明白为什么它不遵守舍入模式。我认为这可能与 NSNumberFormatterCurrencyStyleNSNumberFormatterRoundHalfEven 不兼容有关,所以我将样式更改为十进制并将最小/最大小数位数设置为 2,但它仍然执行方式完全相同。

我认为 NSNumberFormatterNSDecimalNumber 交互可能会发生一些奇怪的事情,所以我尝试了以下代码:

NSDecimalNumberHandler *numberHandler = [[NSDecimalNumberHandler alloc] initWithRoundingMode:NSRoundBankers scale:2 raiseOnExactness:YES raiseOnOverflow:YES raiseOnUnderflow:YES raiseOnDivideByZero:YES];

NSDecimalNumber *decimalTax = [NSDecimalNumber decimalNumberWithString:@"3.785272"];

NSString *rightText = [[decimalTax decimalNumberByRoundingAccordingToBehavior:numberHandler] description];

但它仍然输出以下内容:

tax : 3.785272
textLabel : 3.79

我现在完全不知所措。有没有人发现我在这两种方法中所做的事情有错误?我更喜欢使用涉及 NSNumberFormatter 的第一种方法,因为这样可以避免我进行大量重构,但如果我必须使用第二种方法来获得正确答案,那就这样吧。

最佳答案

不,这对我来说似乎是正确的行为。如果您查看 RoundHalfEven 的文档,它会说

Round towards the nearest integer, or towards an even number if equidistant.

在您的情况下,3.785272 比 3.78 更接近 3.79,因此它等距并且不应该四舍五入数字。

只有当它真正等距时,它才应该四舍五入为偶数,在您的情况下,3.785 将四舍五入为 3.78。

关于ios - 将 NSDecimalNumber 转换为 NSString 时,NSNumberFormatter 舍入不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21737574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com