我了解由于舍入误差问题,货币值应存储为整数并进行处理。这对我来说很有意义,我明白了。
但是税率呢?有什么理由需要将税率(而不是税额,税率,如6.5或8.125)存储为整数而不是十进制?
如果我确实将税率存储为整数,该如何将税率应用于交易中的美元金额?如果我对6.5%的税率进行10000 * 1.065($ 100.00 * 1.065),那么将6.5%的数据库存储为6500而不是6.500会有什么好处?我不认为将一个数字乘以100或将其相除会容易产生舍入误差。
我如何存储税率有关系吗?
最佳答案
首先,不是您不应该使用小数。这是您不应该在想要精确值的地方使用浮点数。并非所有的小数点都是浮点数;请参见C#中的十进制数据类型或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。
关于floating-point - 税率需要存储为整数吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26167262/