Возможно, вы можете использовать theValue - fmod(theValue, 0.01)
для округления, например, до ближайшего 0,01.) Но будьте осторожны!
Компьютеры на самом деле не работают с десятичными числами - т.е. числа в базе десять, как мы их используем в обычной жизни. Они работают с двоичными числами, и это включает числа с плавающей точкой. Они также представлены в двоичном формате, и это означает, что «число десятичных разрядов» не всегда является значимым свойством числа с плавающей запятой.
Например, число с плавающей запятой не может точно представлять 0,1, и вы получите что-то вроде 0,1000000001, если попытаетесь использовать его в своем коде. Точное значение, которое вы получаете, зависит от реализации и не может быть исправлено путем вычитания разницы, так как компьютер не может сказать, что есть разница - это настолько близко, насколько это возможно, к 0,1.
Вот почему существуют такие классы, как NSDecimalNumber
. Они моделируют десятичную математику, чтобы дать значения, которые кажутся нам более разумными. Они подвержены многим из тех же проблем, что и с плавающей запятой, но с разными значениями (например, 1.0 / 3.0 не совсем точно представляется в десятичном виде, но это все же дискретное значение.)
Так что да, если ваши числа должны быть округлены до определенного количества десятичных знаков, вам нужно использовать NSDecimalNumber
для большинства десятичных операций. Если это только для отображения, вы можете использовать что-то вроде NSNumberFormatter
вместо того, чтобы получить отображаемое значение без изменения самого числа в памяти.
Вторая часть вашего вопроса - сохранение числовых значений в пользовательских значениях по умолчанию - легко решается. NSNumber
«оборачивает» примитивный числовой тип, но его можно развернуть:
NSNumber *n = [NSNumber numberWithDouble: 1.234567890];
double aDouble = [n doubleValue];