当前位置: 首页 > news >正文

箱包网站设计长沙会议网站设计哪家专业

箱包网站设计,长沙会议网站设计哪家专业,com域名注册情况,如何做好网络销售推广方案本文已迁移至#xff1a;http://thinkinside.tk/2013/01/01/money.html 快年底了#xff0c;假如你们公司的美国总部给每个人发了一笔201212.21美元的特别奖金#xff0c;作为程序员的你#xff0c; 该如何把这笔钱收入囊中#xff1f; Table of Contents 1 美元#xff…本文已迁移至http://thinkinside.tk/2013/01/01/money.html 快年底了假如你们公司的美国总部给每个人发了一笔201212.21美元的特别奖金作为程序员的你 该如何把这笔钱收入囊中 Table of Contents 1 美元美元2 存入账户3 收税4 转成人民币5 分钱6 记账7 来点高级的8 其他未尽事宜9 小结 1 美元美元 你可能觉得这根本不是问题。在自己的账户中直接加上一笔“转入”就行了。但是首先就遇到了币种的问题。 一般来说银行账户都是单币种的。你可能会说不对啊我的一卡通就能存入不同的币种啊但那是一个“账号Account Number”对应的多个“账户(Account)”。 通常财务记账的时候一个“账户(Account)”都使用同一币种。 账户(Account)记录了资金的往来包含很多条目(Entry)。账户会记录结余结余等于所有条目中金额的总和。 我们不可能为每个币种设计一种条目所以需要抽象出一个货币类——Money适用于各种不同的币种    Money类至少要记录金额和币种: 对于金额由于货币存在最小面额所以金额的类型可以采用定点小数或者整型。考虑到会对金额进行一些运算用整数处理应该更方便。如果用java语言实现可以使用lang类型。 对于币种java提供了java.util.Currency类专门用于表示货币符合ISO 4217货币代码标准。Currency使用Singleton模式需要用getInstance方法获得实例。主要的方法包括 String getCurrencyCode() 获取货币的ISO 4217货币代码int getDefaultFractionDigits() 获取与此货币一起使用的默认小数位数static Currency getInstance(Locale locale) 返回给定语言环境的国家/地区的 Currency 实例static Currency getInstance(String currencyCode) 返回给定货币代码的 Currency 实例。String getSymbol() 获取默认语言环境的货币符号String getSymbol(Locale locale) 获取指定语言环境的货币符号String toString() 返回此货币的 ISO 4217 货币代码通过Currency类的帮助我们的Money类看起来大概是这个样子(为了方便提供多种构造函数) public class Money {private long amount;private Currency currency;public double getAmount() {return BigDecimal.valueOf(amount, currency.getDefaultFractionDigits()).doubleValue();}public Currency getCurrency() {return currency;}public Money(double amount, Currency currency) {this.currency currency;this.amount Math.round(amount * centFactor());}public Money(long amount, Currency currency) {this.currency currency;this.amount amount * centFactor();}private static final int[] cents new int[] { 1, 10, 100, 1000,10000 };private int centFactor() {return cents[currency.getDefaultFractionDigits()];} } 用Money类表示我们的$201212.21奖金就是 Money myMoney new Money(201212.21,Currency.getInstance(Locale.US));   2 存入账户 终于解决了币种的问题可以把钱存入账户了。存入的逻辑是在条目中记录一笔账目并计算账户的余额。 不同币种之间相加或相减是没有意义的为了避免人为错误在Money的代码中就要禁止这种操作。我们可以采用抛出异常的方式。 为了简单起见这里不再定义一个单独的MoneyException而是直接使用java.lang.Exception: public Money add(Money money) throws Exception{if(!money.getCurrency().equals(this.currency)){throw(new Exception(different currency cant be add));}BigDecimal value this.getAmount().add(money.getAmount());Money result new Money(value.doubleValue(),this.getCurrency());return result;}public Money minus(Money money) throws Exception{if(!money.getCurrency().equals(this.currency)){throw(new Exception(different currency cant be minus));}BigDecimal value this.getAmount().add(money.getAmount().negate());Money result new Money(value.doubleValue(),this.getCurrency());return result;}   3 收税 先不要高兴得太早这笔钱属于“一次性所得”需要交20%的个人所得税。税后所得应该是多少 你可能说是80%。只要为Money加上一个multiply(double factor)方法就可以进行计算了。 但是牵扯到了舍入的问题。由于货币存在最小单位在做乘/除法运算的时候就要考虑到舍入的问题了。最好是能够控制舍入的行为。假如税务部门对于 舍入的计算有明确规定我们也可以做一个遵纪守法的好公民。 在java.math.BigDecimal中定义了7种舍入模式 ROUNDUP等于远离0的数。ROUNDDOWN等于靠近0的数。ROUNDCEILING等于靠近正无穷的数。ROUNDFLOOR等于靠近负无穷的数。ROUNDHALFUP等于靠近的数若舍入位为5应用ROUNDUP。ROUNDHALFDOWN等于靠近的数若舍入位为5应用ROUNDDOWN。ROUNDHALFEVEN舍入位前一位为奇数应用ROUNDHALFUP舍入位前一位为偶数应用ROUNDHALFDOWN。我们可以借用这些模式作为参数 public static final int ROUND_UP BigDecimal.ROUND_UP;public static final int ROUND_DOWN BigDecimal.ROUND_DOWN;public static final int ROUND_CEILING BigDecimal.ROUND_CEILING;public static final int ROUND_FLOOR BigDecimal.ROUND_FLOOR;public static final int ROUND_HALF_UP BigDecimal.ROUND_HALF_UP;public static final int ROUND_HALF_DOWN BigDecimal.ROUND_HALF_DOWN;public static final int ROUND_HALF_EVEN BigDecimal.ROUND_HALF_EVEN;public static final int ROUND_UNNECESSARY BigDecimal.ROUND_UNNECESSARY;public Money multiply(double multiplicand, int roundingMode) {BigDecimal amount this.getAmount().multiply(new BigDecimal(multiplicand));amount amount.divide(BigDecimal.ONE,roundingMode);return new Money(amount.doubleValue(),this.getCurrency());}public Money divide(double divisor, int roundingMode) {BigDecimal amount this.getAmount().divide(new BigDecimal(divisor),roundingMode);Money result new Money(amount.doubleValue(), this.getCurrency());return result;}   4 转成人民币 尽管各领域的国际化提了十几年但是在国内想直接用美元消费还是有一定困难。所以你决定将这笔钱换成人民币。 对于账户来说就是在美元账户和人民币账户分别做一笔转出和转入。 转入和转出的amount值是不同的因为涉及到币种转换的问题。 显然账户对象不应该知道如何进行汇率转换责任又落在了Money类上。 最直观的做法是在Money类上增加一个convertTo(Currency currency)的方法。 但汇率实在是一个复杂的问题 汇率是经常变化的汇率转换时的舍入处理会有相关的约定这些复杂的问题处理如果直接放在Money类上会显得十分笨重单独设计一个MoneyConverter类会比较好 import java.util.Currency;public interface MoneyConverter {Money convertTo(Money money,Currency currency) throws Exception; }   我们实现一个最简单的转化器使用固定的汇率值 import java.math.BigDecimal; import java.util.Currency; import java.util.Locale;public class SimpleMoneyConverter implements MoneyConverter {private static final BigDecimal DOLLAR_TO_CNY new BigDecimal(6.2365);private static final Currency DOLLAR Currency.getInstance(Locale.US);private static final Currency CNY Currency.getInstance(Locale.CHINA);Overridepublic Money convertTo(Money money,Currency target) throws Exception{if(!known(money.getCurrency()) || !known(target)){throw (new Exception(unknown currency));}BigDecimal factorSource BigDecimal.ONE, factorTarget BigDecimal.ONE;if(money.getCurrency().equals(DOLLAR))factorSource DOLLAR_TO_CNY;if(target.equals(DOLLAR))factorTarget DOLLAR_TO_CNY;BigDecimal value money.getAmount().multiply(factorSource).divide(factorTarget);return new Money(value.doubleValue(),target);}private boolean known(Currency currency){return(currency.equals(DOLLAR) || currency.equals(CNY) );}}   可以看到即使是最简单的转换器处理起来也比较麻烦。所以千万不要在Money类中做这件事情。 通过转换器可以很容易得到转成人民币后的值。 5 分钱 有好处不能独享。这笔钱你决定和老婆三七开。当然你三 这又是一个新的舍入问题即使你指定各自的舍入计算方法也不能保证各部分舍入后的值加总后仍等于原值。 前面的“可定制乘除法”似乎不能很好的解决这个问题所以我们需要一个新的方法 Money[] allocate(double[] ratioes) 传入分配比例的数组返回分配结果的数组。 为了保证分配的公平可以使用伪随机数来处理误差。 该方法的实现如下 public Money[] allocate(double[] ratioes) throws Exception{if(ratioes.length0){throw (new Exception(there is no ratio));}double ratioTotal 0;for(double ratio:ratioes){ratioTotal ratio;}if(0ratioTotal){throw(new Exception(total of ratioes is zero));}double total this.getAmount().doubleValue();double delta total;Money[] results new Money[ratioes.length];for(int i0;iratioes.length;i){double amount total*ratioes[i]/ratioTotal;results[i] new Money(amount,this.getCurrency());delta - results[i].getAmount().doubleValue();}int i (int)(Math.random() * ratioes.length); results[i] results[i].minus(new Money(delta,this.getCurrency()));return results;}   6 记账 将一切重要的数据保存到数据库是很通常的做法。但是将Money保存到数据库的时候你要小心了 Money不能作为单独的实体。如果把Money当做实体来处理就会产生一些问题 会有很多实体关联到Money比如本文中的AccountEntry等。需要非常小心处理对Money对象的引用避免多个实体引用到同一个Money对象。在第一点的前提下这会变得很困难。所以应该把Money嵌入到需要的实体中而不是把Money作为单独的实体。这样Money仅仅是实体对象比如Entry的一个属性只不过其具有多个内置的属性值。 在JPA中可以使用Embeddable来标注Money类。 更复杂的情况是由于一个Account中的所有Entry都应该具有相同的Currency将Currency保存到Account中会更简洁Entry中只记录ammount。 可以为Money的currency属性增加Transient标注在Entry类的getMoney中进行组装。 7 来点高级的 在DDD领域驱动设计中Money是典型的值对象Value Object。值对象与实体的根本区别是值对象不需要进行标识ID。 这会带来一些处理上的不同 实体对象根据ID判断是否相等值对象只根据内部属性值判断是否相等值对象通常小而且简单创建的代价较小值对象只传递值不传递对象引用不用判断值对象是否指向同一个物理对象通常将值对象设计为通过构造函数进行属性设置一旦创建就无法改变其属性值由于值对象根据内部属性值判等我们要为Money类覆盖equals方法 public boolean equals(Object other) 8 其他未尽事宜 我们还可以为Money类增加互相比较的方法略可以在构造函数中进行格式校验略可以增加一些帮助显式的方法 使用currency的getSymbol(Locale locale)方法、和NumberFormat的format方法比如 NumberFormat nfNumberFormat.getCurrencyInstance(Locale.CHINA); String snf.format(73084.803984);// result73,084.80 9 小结 本文探讨如何在应用中处理货币类型包括币种转换、各种计算、如何持久化等内容。 货币类型是典型的值对象本文也介绍了一点值对象的特点。更多的内容可以参考DDD。 Date: 2013-01-01 02:27:05 CST Author: Holbrook Org version 7.8.11 with Emacs version 24 Validate XHTML 1.0
http://www.huolong8.cn/news/72993/

相关文章:

  • 校园二手网站的建设方案网站做扫一扫
  • 小区媒体网站建设公众号运营工作内容
  • 网站宽屏背景企业网站建设门户
  • 杭州网站建设哪家公司好wordpress如何重置
  • 网站被k 但收录内页淘宝客 网站 备案
  • 那个网站教做冰鲜鱼做网站要学哪些程序
  • 云主机建网站教程竭诚网络网站建设开发
  • 电信网站备案流程图南京江北新区房价走势最新消息
  • 网站规划书的内容有哪些新闻门户网站建设
  • 桐柏网站建设网站建设方案书 下载
  • 做网站的软件高中 通用技术加快网站速度吗
  • 建设网站怎么创建数据库私域流量管理工具
  • 做网站图标的软件wordpress 主题设置
  • 网站浏览器兼容问题wordpress nginx配置
  • 网站建设制作开发什么网站的新闻做参考文献
  • 网站开发费用做账鸿运通网站建设怎么样
  • wordpress网站如何播放视频播放器某公司网络设计方案
  • 赣州网站开发公司腾讯云可视化wordpress
  • 网站开发前台实训三明seo
  • 谷谷互联建的网站如何把qq在线wordpress扫码下载
  • 后台企业网站模板网站制作公司怎么找
  • 网站空间商是什么意思公司网站模板内容
  • 深圳住房和建设局网站 申请男女怎样做那个视频网站
  • 建设网站的意义作用是什么意思怎么查看自己网站是否被收录
  • 美丽寮步网站建设高性能网站安装源码
  • 网站开发报告参考文献网站建设技术风险分析
  • 什么是灰色网站青岛建设网站企业
  • 做名片赞机器人电脑网站是多少wordpress 主题 家居
  • 为什么做图书管理网站让你有做黑客感觉的网站
  • 桂林有名网站制作公司wordpress同分类文章