Skip to content

Instantly share code, notes, and snippets.

@designatednerd
Last active August 29, 2015 14:17
Show Gist options
  • Save designatednerd/b3176dd7d221ed83be31 to your computer and use it in GitHub Desktop.
Save designatednerd/b3176dd7d221ed83be31 to your computer and use it in GitHub Desktop.
NSDecimalNumber lulz
/*
Fun with NSNumber to integer and unsigned integer conversions! This
bit someone trying to use key-value coding to get the average of a
given number out of an array of items with an NSUInteger property.
The NSNumber which came out of the @avg.value KVC method was of value
588.33333333333333333333333333333333333. The person then tried to access
this value by calling both average.integerValue and
average.unsignedIntegerValue.
On this person's computer, which was running Mavericks, the average
integer would be 588. On my computer, running Yosemite, the average
would be zero. After quite a bit of futzing about, we discovered
the following behaviors in NSNumber and NSDecimalNumber when
converting to an integerValue or an unsignedIntegerValue.
TL;DR - There's something screwy about how an NSDecimalNumber created
from a string responds to being converted to an integer if the decimal is
of sufficient length.
*/
import Cocoa
/*
Created from an NSNumber where a float is passed in
OSX 10.10.2, Xcode 6.2 (6C131e): 588
OSX 10.9.5, Xcode 6.1.1 (6A2008a): 588
*/
let numberFromFloat = NSNumber(float: 588.33333333333333333333333333333333333)
numberFromFloat.integerValue
numberFromFloat.unsignedIntegerValue
/*
Created from an NSDecimalNumber where a float is passed in.
OSX 10.10.2, Xcode 6.2: 588
OSX 10.9., Xcode 6.1 (6A2008a): 588
*/
let decimalNumberFromFloat = NSDecimalNumber(float: 588.33333333333333333333333333)
decimalNumberFromFloat.integerValue
decimalNumberFromFloat.unsignedIntegerValue
/*
Created from NSDecimalNumber where a String is passed in
OSX 10.10.2, Xcode 6.2: 0 <--- (╯°□°)╯︵ ┻━┻
OSX 10.9., Xcode 6.1 (6A2008a): 588
*/
let decimalNumberFromString = NSDecimalNumber(string: "588.33333333333333333333333333")
decimalNumberFromString.integerValue
decimalNumberFromString.unsignedIntegerValue
/*
Created from NSDecimalNumber where a String is passed in
OSX 10.10.2, Xcode 6.2: 5
OSX 10.9., Xcode 6.1 (6A2008a): 5
*/
let smallerDecimalNumberFromString = NSDecimalNumber(string: "5.3")
smallerDecimalNumberFromString.integerValue
smallerDecimalNumberFromString.unsignedIntegerValue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment