繁体   English   中英

iOS - 具有双值的操作[重复]

[英]iOS - Operations with double values [duplicate]

这个问题在这里已有答案:

我正在写的APP必须做一些财务计算,基本上都是关于信用,借记和余额。 唯一的问题(到目前为止)是,如果我计算999999999.99 - 0.00,结果是1000000000.00。 拜托,有谁知道为什么会这样? 这是我的代码:

NSNumber *totalCredits;
NSNumber *totalDebits;
NSNumber *balance;

self.credits = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
totalCredits = [self.credits valueForKeyPath:@"@sum.amount"];
double totalCreditsDouble = [totalCredits doubleValue];
self.creditLabel.text = [NSString stringWithFormat:@"%1.2f", totalCreditsDouble];

self.debits = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
totalDebits = [self.debits valueForKeyPath:@"@sum.amount"];
double totalDebitsDouble = [totalDebits doubleValue];
self.debitLabel.text = [NSString stringWithFormat:@"%1.2f", totalDebitsDouble];

balance = [NSNumber numberWithFloat:([totalCredits floatValue] - [totalDebits floatValue])];
double balanceDouble = [balance doubleValue];
self.balanceLabel.text = [NSString stringWithFormat:@"%1.2f", balanceDouble];

所有数据都存储为Double。

C型double通常不太适合财务计算。

Foundation.framework有一个很好的数据类型: NSDecimalNumber NSDecimalNumber使用十进制表示,具有36位精度。

http://floating-point-gui.de/是一个很好的资源。 您试图使用数据类型存储精确值,该数据类型无法以您需要的精度或精度表示它们。

如果这些计算的完整性对您很重要,那么您需要切换到以准确表示它们的格式存储这些值。

在这种情况下,一个简单的解决方案可能是将所有货币以其最小可能面额(例如美分)存储为整数(假设您不需要小数美分并小心且一致地处理任何分配)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM