货币计算避免用Float或Double,会丢失精度。建议用BigDecimal小程序
使用场景微信
最近在作小程序支付功能,微信提供的统一下单接口金额单位为分,因而须要将金额从元转为分spa
最开始使用Float进行计算设计
public static void main(String[] args) { //0.01元 String fee = "0.01"; //转为1分 int money = (int)(Float.parseFloat(fee)*100); System.out.println(money); }
0.01元转为1分是没有问题的,换了一个较大的金额“9999999”,结果计算出来的值为9999998.72code
float和double类型主要是为了科学计算和工程计算而设计的。他们执行二进制浮点运算,这是为了在普遍的数字范围上提供较为精确的快速近似计算而精心设计的。然而它们并无提供彻底精确的结果,因此咱们不该该用于精确计算的场合。float和double类型尤为不适合用于货币运算,由于要让一个float或double精确的表示0.1或者10的任何其余负数次方值是不可能的(其实道理很简单,十进制系统中能不能准确表示出1/3呢?一样二进制系统也没法准确表示1/10)。浮点运算不多是精确的,只要是超过精度能表示的范围就会产生偏差。每每产生偏差不是由于数的大小,而是由于数的精度。所以,产生的结果接近但不等于想要的结果。尤为在使用 float 和 double 做精确运算的时候要特别当心,好比货币金额计算。blog
解决这个问题的正确办法是使用BigDecimal进行货币金额计算接口
使用BigDecimalip
public static void main(String[] args) { //金额,单位元 String fee = "9999999"; BigDecimal decimal1 = new BigDecimal(fee); BigDecimal decimal2= new BigDecimal(100); //金额,单位转为分 int money = decimal1.multiply(decimal2).intValue(); System.out.println(money); //9999999 }
参考地址 ci
货币计算请避免使用float和double https://www.jianshu.com/p/1a6faab3cae4get