为什么不使用Double或Float来表示货币?

问题:

我一直被告知neverdoublefloat类型代表钱,这次我向你提出了问题:为什么?
我相信有一个很好的理由,我根本不知道是什么。

回答:

因为浮标和双打不能准确地代表我们用于货币的10倍的基数。这个问题不仅适用于Java,它适用于使用本机浮点类型的任何编程语言,因为它源于计算机默认处理浮点数的方式。
这是一个IEEE-754浮点数的工作原理:它为符号赋予一点位,存储一个指数为基数,其余为该升高基数的倍数。这导致像10.25这样的数字以类似于1025 * 10 -2的形式表示;除了基数为10,对于floatdouble,它是两个,因此将是164 * 2 -4。 (这还不完全如何在硬件中进行表示,但是这很简单,数学也是一样的。)
即使在10号基地,这个符号也不能准确地代表最简单的分数。例如,对于大多数计算器,1/3会导致重复的0.333333333333,与数字显示允许的多达3个,因为您不能以十进制格式写入1/3。然而,为了钱(至少对于货币价值在一个数量级的美元的国家),在大多数情况下,你需要的是能够存储10 -2的倍数,所以我们不真的很在乎,如果1/3没有精确的表示形式,整数乘以10的幂,甚至最便宜的计算器处理分数也不错。
浮动和双打的问题是,类似于数字的vast majority的数字没有精确的表示形式,而是一个整数倍的幂。实际上,0/100和100/100之间的百分之几(这个数字是以整数方式处理的钱是重要的),它们可以准确地表示为IEEE-754二进制浮点数, 0.25,0.5,0.75和1.所有其他的都是少量的。
代表钱作为doublefloat可能会看起来很好,因为软件消除了微小的错误,但是当您对不精确的数字执行更多的加法,减法,乘法和除法时,您将失去越来越多的精度因为错误加起来。这使得浮动和双打不足以处理货币,其中需要完全准确的基数10倍的倍数。
一个适用于任何语言的解决方案是使用整数,并计算分。例如,1025将是$ 10.25。几种语言也有内置类型来处理金钱。其中,Java具有BigDecimal类,C#具有decimal类型。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why not use Double or Float to represent currency?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 15 = 20