0.1如何转换二进制

  • 十进制转换二进制时存在精度问题,导致小数计算出错

  • 十进制转换二进制的算法:十进制小数转二进制,小数部分,乘 2 取整数,若乘之后的小数部分不为 0,继续乘以 2 直到小数部分为 0 ,将取出的整数正向排序。

  • 例如:十进制0.1转换二进制

0.1 * 2 = 0.2 --------------- 取整数 0,小数 0.2
0.2 * 2 = 0.4 --------------- 取整数 0,小数 0.4
0.4 * 2 = 0.8 --------------- 取整数 0,小数 0.8
0.8 * 2 = 1.6 --------------- 取整数 1,小数 0.6
0.6 * 2 = 1.2 --------------- 取整数 1,小数 0.2
0.2 * 2 = 0.4 --------------- 取整数 0,小数 0.4
0.4 * 2 = 0.8 --------------- 取整数 0,小数 0.8
0.8 * 2 = 1.6 --------------- 取整数 1,小数 0.6
0.6 * 2 = 1.2 --------------- 取整数 1,小数 0.2
...

最终 0.1 的二进制表示为 0.00110011... 后面将会 0011 无限循环,所以二进制无法精确的保存类似 0.1 这样的小数

  • Java在double类型计算0.1+0.2=0.30000000000000004,所以在涉及到金额计算时使用BigDecimal进行计算。

  • BigDecimal可以设置四舍五入和保留小数位数。

  • 金额计算也有使用long类型,可以将最小单位设置为分,例如9999=99.99元。