Last active
August 29, 2015 14:17
-
-
Save designatednerd/b3176dd7d221ed83be31 to your computer and use it in GitHub Desktop.
NSDecimalNumber lulz
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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