Jay*_*uzi 35
浮点类型(float以及double特别不适合于金融应用.
财务计算几乎总是十进制,而浮点类型几乎总是二进制.许多易于用十进制表示的常见值无法用二进制表示.例如,0.2d= 0.00110011...b.有关详细讨论,请参见http://en.wikipedia.org/wiki/Binary_numeral_system#Fractions_in_binary.
同样值得一谈的是你如何在系统中代表价格.decimal由于上面列出的原因,它是一个不错的选择,但浮点数不是.因为您相信面向对象编程,所以您将把它换成decimal新Money类型,对吗?Kent Beck的" 测试驱动开发实例"中提供了一个很好的金钱处理方法.
也许您会考虑将百分比表示为整数,然后在每次使用时除以100.但是,你是在和自己的错误(哎呀,我忘了给分)和未来的灵活性(客户想要的百分比1 /十分之,所以去解决每一个/100要/1000哎呀,错过了一个- .BUG)
根据您的需要,这将为您提供两个不错的选择.一个是decimal.这对于整个百分比来说都很棒10%,但不是像"今天只有1/3关闭!"这样的事情,因为1/3并不完全代表十进制.你喜欢它,如果在1/3的时候购买3件东西作为一个整数出来,对吗?
另一种是使用Fraction存储integer分子和分母的类型.这允许您表示所有有理数的精确值.要么实现自己的Fraction类型,要么从库中选择一个(搜索互联网).
您可以将折扣百分比保存为整数.只需存储10或25或其他什么,当你需要计算出某些东西的价格时:
newprice = price * discount / 100
Run Code Online (Sandbox Code Playgroud)
decimal确实是以性能成本来实现的,但它通常值得用于财务用途.它具有低性能(所有数字类型中最差的)的原因是它不直接映射到硬件类型.这意味着它需要在软件中完成更多的工作.
请注意,这不仅仅是尺寸问题. decimal是10的幂的缩放整数,而浮点数和双精度类型是2的幂的缩放.这意味着终止十进制值,如0.1可以使用精确表示decimal,而它们是非终止(并因此舍入)为float和double.