我在两个浮点之间进行简单的比较。然而,当记录时,我遇到了这个相当基本的代码的一些意外行为:
float balance = self.balance.floatValue;
float amount = self.amountTextField.text.floatValue;
if(amount > balance && self.amountTextField.text != nil){
allowTransfer = NO;
NSLog(@"allowtransfer: %u", allowTransfer);
}
在我的测试用例中,我使用balance
作为47.95
的浮点。
所有这些都与比较相符,直到我尝试47.96
作为余额并且仍然不允许调用传输,所有内容都达到48.00
为什么编译器不考虑小数?
答案 0 :(得分:4)
您的问题是,在比较它们时,您将两个数字都投射到int
,这将截断这两个数字并使其无法精确比较它们,它只会比较整数部分。
要解决它,只需使用float:
float balance = self.balance.floatValue;
float amount = self.amountTextField.text.floatValue;
虽然在处理金钱时,你不应该使用double或float 。原因是它们不支持任意精度,并且您无法表示确切的值(例如0.1 + 0.2
,因为double
实际上是0.30000000000000004
查看NSDecimalNumber的任意精确数字。