double
会让你更接近,但你不能用二进制精确表示 1/10(无论如何使用 IEEE 浮点表示法)。
如果你真的有兴趣,可以看看What Every Computer Scientist Should Know About Floating-Point Arithmetic。链接可耻地从另一个 SO 线程中窃取。
快速而肮脏的解释是,浮点数以二进制形式存储,其中的位表示 2 的小数幂(1/2、1/4、1/8,...)。根本没有数学方法可以将这些分数加起来正好为 1/10,因此 0.1 不能用 IEEE 浮点表示法精确表示。
double
通过在基数之前/之后为您提供更多数字来扩展数字的准确性,但它不会以可以弥补这一点的方式改变二进制文件的格式。你很可能会在稍后的某个地方得到额外的一点。
也可以看看:
和其他类似的线程。
我在下班回家的路上仔细考虑了进一步的扩展:可以想象的一种处理方法是仅以美分(作为 int)表示所有货币值,然后在显示数据时转换为 $.cents 格式。这实际上也很容易,因为您可以在转换时利用整数除法的截断:
int interest, dollars, cents;
interest = 16034; //$160.34, in cents
dollars = value / 100; //The 34 gets truncated: dollars == 160
cents = value % 100; //cents == 34
printf("Interest earned to date: $%d.%d\n", dollars, cents);
我不了解 Objective-C,但希望这个 C 示例也有意义。同样,这只是处理它的一种方法。它还可以通过在需要显示数据时进行字符串格式化的函数来改进。
您显然可以想出自己的(甚至更好!)方法来做到这一点,但也许这会帮助您入门。如果其他人对此有建议,我也想听听他们的意见!