比较浮点数会产生奇怪的行为(>运算符)

时间:2014-08-03 22:27:44

标签: objective-c floating-point

我在两个浮点之间进行简单的比较。然而,当记录时,我遇到了这个相当基本的代码的一些意外行为:

  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

为什么编译器不考虑小数?

1 个答案:

答案 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的任意精确数字。