税率是否需要以整数形式存储?

时间:2014-10-02 18:32:49

标签: floating-point decimal currency rounding-error

据我所知,由于舍入错误问题,应将货币值存储和处理为整数。这对我来说很有意义,我知道了(我认为)。

但是税率怎么样?是否有任何理由需要将税率(不是税额,税率,如6.5或8.125)存储为整数而不是小数?

如果我将税率存储为整数,我如何将税率应用于交易中的美元金额?如果我以6.5%的税率缴纳10000 * 1.065($ 100.00 * 1.065),那么将数据库中的6.5%存储为6500而不是6.500会有什么好处呢?我不相信将数字乘以或除以100一次就容易出现舍入误差。

我存储税率的方式是否重要?

1 个答案:

答案 0 :(得分:2)

首先,并不是你不应该使用小数。这是你不应该使用浮点你想要的确切值。并非所有小数都是浮点数;请参阅C#中的decimal数组类型或Java中的java.math.BigDecimal。

其次,10的幂特别容易受到奇怪的浮点问题的影响,因为实现浮点的方式导致无限重复的小数,除以10的幂。参见this question。这是一个简单的例子:

groovy:000> f = 0.1F // make a floating point number
===> 0.1
groovy:000> f * 100 
===> 10.000000149011612

这是因为0.1的表示是一个被截断的重复小数。在这里,REPL说谎,f中的真实不是0.1,它是0.100000001490116119384765625。

你可以围绕这个继续,there's an argument for doing that

  

要解决此问题,您需要提供适当的舍入。有了钱,这很容易,因为你知道有多少小数位是合适的,除非你有70万亿美元,否则你不会得到足够大的舍入误差,你无法纠正它。

但是使用BigDecimals:

groovy:000> d = new BigDecimal("0.1")
===> 0.1
groovy:000> d * 100
===> 10.0

使用固定点小数,这样您就可以确切知道您的号码。如果您的语言没有固定的小数(如Javascript),you may have to fall back on integers