c浮点数保留两位⼩数_浮点数精度丢失的问题
精度丢失的原因
了解了原理,现在我们可以开始分析精度丢失的原因,下⾯我们来模拟计算机的运算过程。
第⼀步,将⼗进制结果转换成⼆进制。⽂章开头的例⼦中,⼗进制结果是2.7,由于2.7⽆法⽤⼆进制精确表⽰,因此出现第⼀次精度丢失。
2.7 => 10.10110011001…
第⼆步,⽤IEEE标准表⽰⼆进制浮点数,得到s=0,M=1.010*********…,E=1。
10.1011001… => (-1)^0 × 1.01011001… × 2^1
第三步,按照IEEE标准保存数据。此时是单精度浮点数,M只能保存⼩数点后23位,多余的部分被丢弃了,因此出现第⼆次精度丢失。下⾯是计算机中实际保存的结果。
1位
8位
23位
丢弃
10000000
01011001100110011001100
11001…
第四步,从内存中取出⼆进制数值,还原成⼗进制后显⽰在屏幕上。由于前⾯已经经历了两次精度丢失,因此还原出来的结果也就不正确了。
如何避免精度丢失
使⽤整数替代浮点数。⼆进制整数可以完整的表⽰所有⼗进制整数,不存在精度丢失问题,因此我们可以将⼩数位数固定或者较少的数字转换成整数存储。⽐如存储货币⾦额,如果存储单位是元,则需要保留两位⼩数,例如23.45元。如果将单位改成分,则可以完全使⽤整数存储,例如2345分。
使⽤特殊类处理⾼精度运算。例如JAVA中的Bigdecimal类。不过要注意,使⽤这些特殊类虽然可以解决精度问题,但有可能带来其它问题,JAVA中的Bigdecimal类在处理性能上就⽐float和double要低很多。
bigdecimal格式化两位小数阶数位⽆符号位取⼀个中间值127

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。