小数精度丢失问题

例子:

x := 74.96
y := 20.48
b := x - y
fmt.Println(b) //output: 54.47999999999999

上面是使用普通编码

硬编码的方式如下:

fmt.Println(74.96-20.48) //54.48

  

百度关于硬编码的解释一堆话

 

 

以上的话对于本问题没有任何卵用。

最关键的就两句如下

1、编码方式不同:

普通编码:使用CPU进行编码。

硬编码:使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等。

 

为什么普通编码会出现精度丢失问题,是因为使用CPU编码时  1011101.101  这个二进制是我瞎乱打的,但是在CPU编码就是使用"."点后几位数 来表示小数部分。

“.”后部分在计算的时候是 :1*2^-1+0*2^-2+1*2^-3  来计算的,当然这些话也没什么卵用最关键就一句,在有限小数情况下二进制只能表示部分小数,也就是说你需要的小数二进制没法表示,所以会出现精度丢失问题。

 

  那么硬编码不会出问题因为他用的不是CPU编码,那么不用CPU是咋进行编码的我没兴趣知道,就这样。

 

解决方案还是要写一下,

将小数变为整数再变为小数就这样,比如计算100.1 +0.1 

变为 ((100.1*10) +0.1) / 10

posted on 2020-05-04 19:15  thotf  阅读(404)  评论(0)    收藏  举报

导航