2013-03-22 4 views
2

Мой простой код RubyMotion:NSJSONSerialization.JSONObjectWithData float conversion/rounding error?

data = DataParser.parse(url) 
error_ptr = Pointer.new(:object) 
json = NSJSONSerialization.JSONObjectWithData(data, options: 0, error: error_ptr) 

URL-адрес является погода API, который обеспечивает JSON с температурой, как поплавки, как { "temp_c":22.4, ... }. Странно, что плавающий 22.4 преобразуется в 22.3999938964844.

Если я проверяю data.to_s, температура читается 22.4, поэтому я предполагаю, что ошибка лежит в пределах NSJSONSerialization.JSONObjectWithData.

  • Может кто-нибудь подтвердить это?
  • Есть ли общее решение для этого?

Я бы не хотел заставлять округлять все поплавки.

ответ

5

десятичное число «22,4» не может быть представлено точно с помощью двоичного числа с плавающей точкой, такие как float или double. Итак, «округление поплавка до 22,4» не имеет смысла, потому что нет плавающего значения, равного 22,4.

Вы можете указать точность, если вы конвертируете число с плавающей запятой в десятичную строку для вывода. Вы можете использовать NSNumberFormatter или printf-формат, например "%.<precision>f.