一、java精度计算
java的数据类型对长度有限制,在进行较大金额计算或者小数位较多时,需要用BigDecimal来处理这种精度问题。
public static void main(String[] args)
{
BigDecimal a = new BigDecimal("4.5");
BigDecimal b = new BigDecimal("1.5");
System.out.println("a + b =" + a.add(b));
System.out.println("a - b =" + a.subtract(b));
System.out.println("a * b =" + a.multiply(b));
System.out.println("a / b =" + a.divide(b));
}
二、javascript精度计算
对于JavaScript则容易出现以下问题
0.1 + 0.2
=> 0.30000000000000004
6.8 -0.9
=> 5.8999999999999995
7 * 0.8
=> 5.6000000000000005
5.6 / 0.8
=> 6.999999999999999
这是因为计算机内部计算,都是使用2进制数,而当js将我们使用的10进制转化为2进制数时,由于其遵循IEEE 754的国际标准,无法精确表示这种包含小数点的数据,因此JS将浮点数转换成了用二进制表示的最接近的近似值,这步操作就是导致误差的原因。
解决方案是:定一个函数对计算结果进行转换和处理:通过将浮点数转换成整数进行计算,然后再将整数的小数点位调整,转回正确的浮点数结果。
此外:浮点数运算精度丢失问题并不是js独有的!只是诸如 C++/C#/Java 这些语言中已经封装好了方法来避免精度的问题。
// type1: 导库:npm install decimal.js
const Decimal = require('decimal.js');
console.log(Decimal(66.6667).plus(Decimal(33.3333)))//100
// type2: 导库:npm install big.js
const Big = require('big.js');
console.log(Big(66.6667).plus(Big(33.3333)).toNumber())//100
// type3: 导库:npm install mathjs
const Math = require('mathjs');
const mathResult = Math.chain(66.6667)
.add(33.3333)
.done()
console.log(mathResult)//100
// type4: 导库:npm install bignumber.js
const BigNumber = require('bignumber.js');
console.log(BigNumber(66.6667).plus(BigNumber(33.3333)).toNumber())//100