Simon.hu 发表于 2019-6-24 14:38:49

看完必恍然大悟的活字格内幕:三十二、如何处理浮点误差

本帖最后由 Simon.hu 于 2019-6-24 15:50 编辑

作为一个不但可以开发Web应用有可以用了解计算机相关理论知识的产品社区,这次我们又要给大家普及一下一个新的名词-----------浮点误差。
http://img.soogif.com/hniRHMdJ58xJifyZnzlf3RcnVepEhRpm.jpg_s400x0
为什么我要给答案及普及这个知识呢?
大家在使用活字格的时候,你会发现一些很奇怪的现象,如下用例:
我有一个表,其中他有2列:【金额】【**额】,他们都是小数列,并且我在其中添加了数据,金额:741.6    **额:700

然后我做了一个公式字段,未开票等于金额减去**额,如下:

然后我们就将其设置绑定到页面的表格上

但是尴尬的时候来了,等我运行以后,在浏览器上发现这个【未开票】多了好长的一串0000002等等字符

http://img.soogif.com/NbJrfGcC8b97Q26cqYxzemiUrvWdVELg.gif_s400x0
为什么会出现这样的情况呢?
原因就是浮点误差!!!!!!!

浮点误差是什么?
其实,这就是计算机的一点的小小的机制导致:二进制表示十进制的时候会有小误差。
浮点数的误差的产生一般由于两个原因
1)由于计算机内部以二进制保存,所以十进制的有限位的小数,在计算机内部会是一个无限位的小数。
例如 十进制的0.9虽然只有一位小数,转成2进制是无限循环小数0.1110011001100110011...
2)计算机保存浮点数的精度有限,例如float可以保留十进制最多7位(二进制23位)有效数字,double 可以保留十进制15~16位(二进制52位)有效数字。那有效数字以后的就被忽略了。
例如上面的0.9的表示受精度所限,精度以后的就被忽略了,这样
float时,它是0.89999998
double时,它是0.90000000000000002http://img.soogif.com/uQGhj5ouTNxFkzIyOPwCJGDKlGvtT1sA.gif_s400x0
科普完毕!!!
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>我是一条可爱的分割线<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

如何在活字格中避免浮点误差?

之前的科普可能会让你觉得这个问题,既然是二进制和十进制的转换问题,不管你怎么设置都躲不过啊?
老铁,你说的确实没毛病,但是,搞活字格的脑洞不大,你怎么能做好呢?;P

我要开始表演了哈~
既然他是因为小数在二进制和十进制的小数问题上,那我们可以想一下怎么让他没有小数呢????
当然有办法了,比如一般的跟金额相关的数字,无非就是2位小数么,那我们完全可以先给他乘以100,然后在做运算,最后在给结果除以100不就行了
比如,我把这个公式字段修改成:


http://img.soogif.com/CNciNQmF54MYh3JBex9lrP7p7ymttDOV.gif_s400x0
那么在浏览器上不就好了么?

当然很多的小伙伴也在使用round函数在处理,也是可以的。


我主张不管使用什么办法,只要能达到目的都是好办法!



页: [1]
查看完整版本: 看完必恍然大悟的活字格内幕:三十二、如何处理浮点误差