关于程序开发当中钱的数据类型

     在实际的应用当中 如果涉及到金钱之类的数据类型,一直想寻找一个合适的java数据类型来处理这方面的事情

前几天开了java解惑一本书,里面对很多平时不在意的一些细节做了详细的解惑。针对“小数详细计算”的解惑:

当我们用System.out.pritnln("3.00-2.10"):的时候 我们希望得到的是 “银行”应该给“客户”的利息9毛钱。即0.9元

。。但是如果让计算机来计算的时候,它就无形中吃掉你些许的money,也许实际你账户的利息值不到9毛,也许单个"客户" 不会在意,但是如果世界上所有的人都被这样吃了些许钱,那银行就赚大了。

 

    呵呵,上面的计算出的结果不是 0.9,而是一连串的小数。问题在于2.1这个数字不能被精确表示为一个double,因此它被表示为最接近它的double值,该程序从3中减去的就是这个值,但这个计算的结果并不是最接近0.9的double值。

 

一般地说,问题在于并不是所有的小数都可以用二进制浮点数精确表示。二进制浮点对于货币计算是非常不适合的,因为它不可能将1.0表示成10的其他任何负次幂。

 

解决问题的第一种方式是使用货币的最小单位(分)来表示:将所有的大单位的钱都转换为分,就可以计算了,300-210=90(分)

 

第二种方式是使用BigDecimal,但一定要用BigDecimal(String)构造器,而千万不要用BigDecimal(double)来构造(

也不能将float或double型转换成String再来使用BigDecimal(String)来构造,因为在将float或double转换成String

时精度已丢失)。例如new BigDecimal(0.1),它将返回一个BigDecimal,也即

0.1000000000000000055511151231257827021181583404541015625,正确使用BigDecimal,程序就可以打印出我们所期

望的结果0.9:

 

2.负的十六进制与八进制字面常量 

“数字字面常量”的类型都是int型,而不管他们是几进制,所以“2147483648”、“0x180000000(十六进制,共33

位,所以超过了整数的取值范围)”字面常量是错误的,编译时会报超过int的取值范围了,所以要确定以long来表示

“2147483648L”、“0x180000000L”。

十进制字面常量只有一个特性,即所有的十进制字面常量都是正数,如果想写一个负的十进制,则需要在正的十进制

字面常量前加上“-”即可。

 

十六进制或八进制字面常量可就不一定是正数或负数,是正还是负,则要根据当前情况看:如果十六进制和八进制字

面常量的最高位被设置成了1,那么它们就是负数://字面量0x80000001为int型,最高位(第32位)为1,所以是负数  

//字面量0x80000001L强制转为long型,最高位(第64位)为0,所以是正数  

从上面可以看出,十六进制的字面常量表示的是int型,如果超过32位,则需要在后面加“L”,否则编译过不过。如

果为32,则为负int正数,超过32位,则为long型,但需明确指定为long。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值