При переводе из NSNumber в double число из 2.3 превращается в 2.2999999998
Здесь дело не в переводе, а в невозможности точного предоставления некоторых десятичных дробей в двоичном виде.
Тут можно как-то без костылей обойтись или нет?
Используйте NSDecimalNumber. NSDecimalNumber наследник NSNumber'а, но он хранит мантиссу и экспоненту раздельно в целочисленных переменных: мантиссу в переменной типа int, а экспоненту в переменной типа short.
NSNumber *number = [NSDecimalNumber decimalNumberWithMantissa:23 exponent:-1 isNegative:NO];
Ни в коем случае не приводите number к float или double (т.е. не используйте doubleValue и floatValue), иначе потеряете точность.