Converting Double to NSNumber in Swift Loses Accuracy [duplicate]
Firstly, you're confusing some terms. 79.98999999999999
is higher precision than 79.99
(it has a longer decimal expansion), but lower accuracy (it deviates from the true value).
Secondly, NSNumber does not store neither 79.99
nor 79.98999999999999
. It stores the magnitude of the value according to the IEEE 754
standard. What you're seeing is likely the consequence of the printing logic that's applied to convert that magnitude into a human readable number. In any case, you should not be relying on Float
or Double
to store values with a fixed precision. By their very nature, they sacrifice precision in order to gain a longer range of representable values.
You would be much better off representing prices as an Int
of cents, or as an NSDecimalNumber
.
Please refer to Why not use Double or Float to represent currency?