盐城大丰网站建设找哪家好,海外网络加速器免费,r6300v2做网站,找网站公司做网站是怎样的流程一、原因
原因很简单#xff0c;计算机存储和计算数组都是用二进制#xff0c; 而大部分小数转二进制的时候#xff0c;就丢失精度了。 0.1、0.2、0.3这些小数在二进制里都是循环小数#xff0c;计算机不可能存储无限循环小数#xff0c;所以只能截取一部分#xff0c;导…一、原因
原因很简单计算机存储和计算数组都是用二进制 而大部分小数转二进制的时候就丢失精度了。 0.1、0.2、0.3这些小数在二进制里都是循环小数计算机不可能存储无限循环小数所以只能截取一部分导致本身失去精度。 计算机再用这些有误差的小数进行计算那误差就更大了。
互转教程十进制小数 与 二进制小数 互转 二、一分钱问题
假如用float和double进行金钱计算因为二进制转换误差就很容易出现一分钱问题。
方案
方案1、 使用BigDecimal
BigDecimal a new BigDecimal(0.1); //切记参数一定要是字符串
BigDecimal b new BigDecimal(0.2); //切记参数一定要是字符串
BigDecimal c a.add(b);
System.out.println(c);切记 创建BigDecimal参数一定要是字符串。 如果直接传参浮点数计算机自动转二进制同样会有误差
方案2、 使用long
1、金钱保存到数据库时金钱乘1000字段类型为整型。 2、计算时就使用整型计算。 3、显示时金钱/1000。
long a 0.1 * 1000;
long b 0.2 * 1000;
long c a b;
System.out.println(c / 1000);三、扩展知识 IEEE-754二进制
计算机浮点数标准。 它规定了浮点数的表示、运算和舍入方式等方面的规则。
1、IEEE-754二进制组成
类型符号位阶码尾数float占1bit占8bit占23bitdouble占1bit占11bit占52bit
符号位0表示正数1表示负数。指数浮点数的大小和符号的指数部分。127偏移量尾数浮点数的小数部分。
2、十进制float转IEEE-754二进制
步骤例子0.5例子-121获取【符号位】0表示正数1表示负数。0.5是正数符号位为0-12是负数符号位为12十进制小数 转 二进制十进制0.5转二进制 0.1十进制-12转二进制 1100.0113二进制转科学计数法1.xx * 2 指数 2^{指数} 2指数 1.0 ∗ 2 − 1 1.0 * 2^{-1} 1.0∗2−1 1.100011 ∗ 2 3 1.100011 * 2^3 1.100011∗234获取十进制指数值127指数127-1126127 3 1305 【指数值】 十进制 转 二进制不满八位前面补0126 -01111110130 - 100000106【尾数位】科学计数法的 xx不满23位后面补0xx为0补零00000000 00000000 0000000xx为100011补零10001100 00000000 00000007拼接 符号位指数值尾数位0 10000010 000000000000000000000001 10000010 10001100000000000000000
我们再用上面步骤计算float 0.1。
0.1获取符号位0.1正数为0。0.1转二进制0.00011001100110011001101已失去精度科学计数法 1.1001100110011001101 ∗ 2 − 4 1.1001100110011001101 * 2^{-4} 1.1001100110011001101∗2−4获取十进制指数值127 (-4) 123指数值 转 二进制123 - 01111011尾数位补零10011001 10011001 101IEEE-754二进制0 01111011 1001100110011001101